SQL調優方案對比與最佳實踐

封面圖片

問題背景介紹

在大型互聯網或企業級應用中,數據庫往往成為系統性能的瓶頸。隨著數據量和并發量的增長,單一的 SQL 查詢可能出現響應遲緩、鎖等待、全表掃描等性能問題。為保證系統的穩定性和用戶體驗,需要對 SQL 查詢做深入的調優。常見的調優手段包括索引優化、查詢重寫、分庫分表、緩存方案等。本文將從多種方案入手,對比分析各自優缺點,并結合真實生產環境案例展示調優效果。

多種解決方案對比

方案 A:索引優化

  • 原理:為頻繁篩選或排序的列建立合適的索引,避免全表掃描。
  • 實現:使用 B-Tree、哈希索引或覆蓋索引。

示例:為訂單表的 user_idcreated_at 建聯合索引:

ALTER TABLE orders ADD INDEX idx_user_created (user_id, created_at DESC);

使用 EXPLAIN 查看執行計劃:

EXPLAIN SELECT * FROM orders WHERE user_id = 1234 ORDER BY created_at DESCLIMIT 10;

方案 B:查詢重寫與分頁優化

  • 原理:通過拆分復雜 SQL,避免大范圍排序與聯表;優化分頁查詢。
  • 實現:利用覆蓋索引分頁、二次過濾或游標。

示例:傳統高頁碼分頁會嚴重影響性能:

SELECT * FROM orders WHERE user_id = 1234 ORDER BY created_at DESC LIMIT 100000, 20;

重寫為“基于最后讀取位置的分頁”:

-- 前一頁最后一行的 created_at 值
SET @last_time = '2024-07-01 12:34:56';SELECT * FROM ordersWHERE user_id = 1234AND created_at < @last_timeORDER BY created_at DESC LIMIT 20;

方案 C:分區表 & 分庫分表

  • 原理:通過按時間或用戶 ID 手動/自動劃分表或數據庫,減少單表或單庫數據量。
  • 實現:MySQL 原生分區、Proxy 層分片、ShardingSphere 等。

示例:按月份進行分區:

ALTER TABLE ordersPARTITION BY RANGE (TO_DAYS(created_at)) (PARTITION p202407 VALUES LESS THAN (TO_DAYS('2024-08-01')),PARTITION p202408 VALUES LESS THAN (TO_DAYS('2024-09-01'))
);

方案 D:緩存層(Redis)

  • 原理:將熱點查詢結果緩存在內存中,減少數據庫壓力。
  • 實現:使用 Redis 哈希、Sorted Set 或自定義緩存策略。

示例:通過 Spring Cache 簡單集成:

@Service
public class OrderService {@Cacheable(value = "orderList", key = "#userId")public List<Order> getRecentOrders(long userId) {return orderMapper.findByUserOrderByCreatedAt(userId, 20);}
}

各方案優缺點分析

| 方案 | 優點 | 缺點 | |------------|--------------------------------------------------------------|--------------------------------------------------------------| | 索引優化 | 最基礎、低成本;即插即用;顯著減少全表掃描 | 建索引占用空間;寫入性能略有下降;對復雜查詢提升有限 | | 查詢重寫 | 針對性強;可解決分頁等特定問題 | 代碼層復雜度上升;需分析不同場景重寫策略 | | 分區/分表 | 支撐超大規模數據;單表/單庫規模可控 | 設計和運維復雜;跨分區/跨庫查詢難;可能導致跨庫事務問題 | | 緩存層 | 減少數據庫壓力;提升響應速度 | 緩存一致性、熱點失效、二級緩存上下文復雜 |

選型建議與適用場景

  1. 數據量中等(百萬級)且查詢模式穩定:優先考慮 方案 A:索引優化方案 B:查詢重寫。低成本、風險小。
  2. 業務增長迅速、表數據量突破千萬甚至億級:結合 方案 C:分區表/分庫分表。大型電商、日志系統等。
  3. 熱點數據重復訪問高:在以上方案基礎上引入 方案 D:緩存層。防止緩存雪崩采用雙層緩存或預熱策略。
  4. 混合場景:可按業務模塊拆分策略(OLTP 與 OLAP 分離),或采用 HTAP 數據庫(如 TiDB)兼顧多種需求。

實際應用效果驗證

場景:電商訂單列表查詢

  • 典型 SQL:按照用戶查詢、按下單時間倒序分頁。
  • 初始數據:orders 表記錄量 5000 萬,按頁碼分頁時 5000 頁后響應時間超 2s。

優化前 EXPLAIN:

+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table  | type | possible_keys | key  | rows    | Extra                |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | orders | ALL  | NULL          | NULL | 50000000| Using filesort       |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
  • 方案 A 索引優化:新增 (user_id, created_at) 聯合索引后,響應時間降至 200ms。
  • 方案 B 分頁重寫:基于 created_at 游標分頁,5000 頁查詢 95% 都在 50ms 內完成。
  • 方案 C 分庫分表:按用戶哈希分 8 庫后,最慢頁響應 < 100ms。
  • 方案 D Redis 緩存:熱點前 100 頁結果均在 5ms 內返回。

綜合來看,方案 A + 方案 B 是快速見效的低成本首選;方案 C + 方案 D 可結合應對超高并發與 PB 級數據量。


作者:匿名

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87157.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87157.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87157.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Terraform Helm:微服務基礎設施即代碼

&#x1f680; Terraform & Helm&#xff1a;微服務基礎設施即代碼 &#x1f4da; 目錄 &#x1f680; Terraform & Helm&#xff1a;微服務基礎設施即代碼1. 引言 &#x1f680;2. 環境與依賴 &#x1f9f0;3. 架構示意 &#x1f3d7;?4. Terraform 定義云資源 &…

清理 Docker 緩存占用

Docker 緩存主要包括未使用的鏡像、容器、卷和網絡等資源。清理緩存可以提高磁盤空間&#xff0c;線上升級次數比較多的話&#xff0c;服務器中Docker緩存會非常嚴重&#xff0c;做下清理瘦身會有意想不到的效果 清理未使用的鏡像 運行以下命令刪除未被任何容器引用的鏡像&…

深入解析NumPy的核心函數np.array()

深入解析NumPy的核心函數np.array NumPy與np.array()簡介NumPy的重要性np.array()的作用 np.array()函數的詳細參數object參數dtype參數copy參數order參數subok參數ndmin參數like參數 np.array()函數的使用示例創建基本的一維和二維數組創建具有特定數據類型的數組創建多維數組…

定時器的設計

定時器 定時器原理如何理解定時器定時器數據結構選取定時器觸發方式 定時器的實現 定時器原理 如何理解定時器 定時器在日常通常被描述為組織大量延時任務的模塊&#xff0c;其實從字面意思去理解的話&#xff0c;他就是去處理延時任務的&#xff0c;那么什么是延時任務呢&am…

大模型-分布式論文一瞥

1分離式架構 1.1 DistServe DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving 講的是一個將prefill和decoding分…

02.SpringBoot常用Utils工具類詳解

文章目錄 1. BeanUtils詳解1.1 什么是BeanUtils&#xff1f;1.2 主要的BeanUtils實現1.2.1 Spring BeanUtils1.2.2 Apache Commons BeanUtils1.2.3 其他實現 1.3 Spring BeanUtils詳細使用1.3.1 基本用法1.3.2 指定忽略屬性1.3.3 批量拷貝&#xff08;列表轉換&#xff09; 1.4…

Golang快速開發框架——項目立項與系統配置讀取組件viper(一)

Golang快速開發框架——項目立項與系統配置讀取組件viper&#xff08;一&#xff09; 背景 知識分享之Golang篇是我在日常使用Golang時學習到的各種各樣的知識的記錄&#xff0c;將其整理出來以文章的形式分享給大家&#xff0c;來進行共同學習。歡迎大家進行持續關注。 知識分…

打造可觀測的 iOS CICD 流程:調試、追蹤與質量保障全記錄

隨著iOS項目復雜度增加&#xff0c;團隊越來越依賴自動化構建、自動化測試等CI/CD流程來保證產品質量。但CI/CD環境下&#xff0c;很多線下調試手段無法直接使用&#xff0c;比如&#xff1a; 無法手動連真機跑Instruments測試包只在分發后才能拿到崩潰模擬器上表現和真機不一…

C++11中 <cinttypes>的入門與精通

文章目錄 一、<cinttypes> 是什么1. 固定寬度的整數類型2. 整數操作函數3. 格式化輸入輸出宏 二、深入理解 <cinttypes>1. 固定寬度整數類型的使用2. 整數操作函數的使用3. 格式化輸入輸出宏的使用 三、實踐和技巧1. 使用固定寬度整數類型的最佳實踐2. 使用整數操作…

Pytorhc Lightning進階:一篇實例玩轉Pytorhc Lightning 讓訓練更高效

Pytorhc Lightning進階&#xff1a;一篇實例玩轉Pytorhc Lightning 讓訓練更高效 Pytorhc Lightning 主要包含以下幾大類&#xff0c;主要圍繞以下講解&#xff1a; 模型&#xff0c;PyTorch Lightning 的核心是繼承 pl.LightningModule數據&#xff0c;數據模塊繼承pl.Light…

大模型算法面試筆記——注意力Transformer流程/面試題篇

學習資料來源于字母站大學 1 Transformer架構 基于編碼器-解碼器的架構來處理序列對。跟使用注意力的seq2seq不同&#xff0c;Transformer是基于純注意力。 2 注意力 2.1 自注意力機制 使用注意力&#xff1a;需要根據整個序列進行預測&#xff0c;對于同一input&#xf…

Rust 定義與實例化結構體

文章目錄 Rust 定義與實例化結構體5.1 結構體的定義與意義5.2 結構體實例化5.2.1 基本實例化5.2.2 可變性規則5.2.3 字段初始化簡寫5.2.4 結構體更新語法 5.3 特殊結構體類型5.3.1 元組結構體&#xff08;Tuple Struct&#xff09;5.3.2 類單元結構體&#xff08;Unit-Like Str…

ELK日志分析系統(filebeat+logstash+elasticsearch+kibana)

一、ELK 平臺介紹 1、ELK 概述 日志主要包括系統日志、應用程序日志和安全日志。系統運維和開發人員可以通過日志了解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日志可以了解服務器的負荷&#xff0c;性能安全性&#xff0c;從而及時采取措施糾正錯誤。…

JS基礎4—jQuery

jQuery常用內容 jQuery 介紹jQuery 獲取方式基本選擇器 (最常用)層級選擇器 (基于元素間關系)過濾選擇器 (基于特定條件) jQuery事件綁定jQuery 方法調用jQuery遍歷jQuery 獲取與設置jQuery 添加與刪除jQuery CSS 類jQuery - AJAX 總結 jQuery 介紹 jQuery 是一個輕量級、快速…

時鐘周期是什么?

時鐘周期&#xff08;Clock Cycle&#xff09;是什么&#xff1f; 時鐘周期&#xff08;Clock Cycle&#xff09;是計算機系統中一個最基礎的時間單位&#xff0c;也稱為時鐘節拍或時鐘周期時間&#xff08;Clock Period&#xff09;。它由系統時鐘發生器產生的一個周期性脈沖…

如何用SEO優化長尾關鍵詞?

內容概要 在SEO優化領域&#xff0c;長尾關鍵詞扮演著至關重要的角色&#xff0c;它們能有效提升網站在搜索引擎中的可見度和流量轉化率。本文將全面解析如何通過系統方法優化長尾關鍵詞&#xff0c;涵蓋從基礎理論到實戰應用的完整流程。核心內容包括利用專業工具進行關鍵詞挖…

電子面單系統開發全解析

一、如果要做電子面單系統&#xff0c;怎么做&#xff1f; 開發電子面單系統是一項復雜且涉及多方面考量的工程&#xff0c;涵蓋需求分析、系統架構設計、技術選型、接口對接、安全性保障、第三方服務選擇以及部署與維護等關鍵環節。 電子面單系統開發步驟 需求分析&#xf…

UE5 - 制作《塞爾達傳說》中林克的技能 - 18 - 磁力抓取器

讓我們繼續《塞爾達傳說》中林克技能的制作!!! UE版本:5.6.0 VS版本:2022 本章節的核心目標:磁力抓取器 先讓我們看一下完成后的效果: 18_磁力抓取器 大綱如下: 引言功能架構與核心邏輯物理材質與場景配置代碼實現:從識別到操控操作說明1.引言 在《塞爾達傳說》中,林…

基于ApachePOI實現百度POI分類快速導入PostgreSQL數據庫實戰

目錄 前言 一、百度POI分類簡介 1、數據表格 2、分類結構 二、從Excel導入到PG數據庫 1、Excel解析流程 2、數據入庫 3、入庫成果及檢索 三、總結 前言 在上一篇博文中&#xff0c;我們對高德POI分類進行了深入剖析 并對Excel 中 POI 分類數據的存儲結構特點進行了詳細介…

學習經驗分享【41】YOLOv13:基于超圖增強自適應視覺感知的實時目標檢測

YOLO算法更新速度很快&#xff0c;已經出到V13版本&#xff0c;后續大家有想發論文或者搞項目可更新自己的baseline了。 摘要&#xff1a;YOLO 系列模型憑借其卓越的精度和計算效率&#xff0c;在實時目標檢測領域占據主導地位。然而&#xff0c;YOLOv11 及早期版本的卷積架構&…