首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 查詢優化三板斧:索引、EXPLAIN、參數調優

     編輯:MySQL 綜合教學

(本文與 ID 178475 主題相同,此處提供不同切入點的精簡實戰版,側重「如何在生產環境快速落地」。)

優化前的心法:測量優於猜測

  1. 開啟慢查詢日誌(`long_query_time=1`),收集 Top 10 耗時 SQL。
  2. 用 `EXPLAIN` 看執行計劃,找出 `type=ALL`(全表掃描)、`rows` 巨大、`Using temporary`、`Using filesort` 的語句。
  3. 確認表結構、索引、資料量、業務頻率,再決定優化手段。

招式一:索引精準施策

必建索引清單

  • 主鍵(隱含聚簇索引)
  • 外鍵欄位(JOIN 條件)
  • WHERE/HAVING/ORDER BY/GROUP BY 高頻欄位

組合索引黃金法則(最左前綴原則)

-- 查詢:WHERE a=1 AND b=2 ORDER BY c
-- 最佳索引:INDEX idx_a_b_c (a, b, c)
-- 失效案例:WHERE b=2 (未用最左列 a)

覆蓋索引

查詢只需掃描索引樹即可滿足,無需回表。`EXPLAIN` 出現 `Using index` 即命中。例:`SELECT id, name FROM users WHERE status=1` + `INDEX idx_status_name (status, name)`。

索引維護成本控制

  • 單表索引 ≤ 5 個(核心交易表)
  • 定期 `ANALYZE TABLE` 更新統計資訊
  • 監控 `Handler_read_*` 狀態變數評估索引命中率

招式二:EXPLAIN 讀懂執行計劃

關鍵欄優化解讀
typesystem/const > eq_ref > ref > range > index > ALL。目標至少達 ref。
possible_keys / key可能用到的索引 vs 實際用到的。NULL 表示無索引可用。
key_len實際用到的索引長度。判斷組合索引用了幾列。
rows預估掃描行數。越小越好,配合 `filtered` 看過濾效率。
ExtraUsing index(覆蓋索引佳)、Using where(Server層過濾)、Using temporary(需優化)、Using filesort(排序未走索引)。

進階工具:`EXPLAIN FORMAT=TREE` (8.0.16+)、`EXPLAIN ANALYZE` 顯示實際耗時與迴圈次數。

招式三:關鍵參數微調(按機器規格調整)

參數建議起始值調整觀測指標
innodb_buffer_pool_size物理記憶體 60-75%Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests < 1%
innodb_log_file_size1-4 GB寫入延遲、檢查點頻率
innodb_flush_log_at_trx_commit1(安全) / 2(高效)資料安全性 vs 寫入吞吐權衡
max_connections應用峰值連線數 + 余量Threads_connected、Connection_errors_max_connections
table_open_cache4000+(高併發)Opened_tables / Uptime > 2 時需調大
sort_buffer_size / read_buffer_size256K-1M(每線程)Sort_merge_passes、全表掃描頻率
long_query_time1 秒慢查詢日誌數量與品質

持續優化閉環

  1. **每日**:巡檢慢查詢日誌 Top 10。
  2. **每週**:`pt-index-usage` 分析未用索引、`pt-duplicate-key-checker` 找重複索引。
  3. **每月**:容量規劃、參數複盤、大表歸檔/分區評估。

優化無終點,只有「當下足夠好」。建立度量、持續迭代,才是 DBA 的核心價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved