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

MySQL SQL 查詢優化實戰指南:索引、EXPLAIN 與配置調校三步走

     編輯:MySQL 綜合教學

本文系統闡述 MySQL 查詢優化的標準化三步驟:建立有效索引、EXPLAIN 分析執行計畫、調整關鍵配置參數,並以雙表關聯查詢為例,展示從全表掃描到索引覆蓋的劇效提升。

步驟 1:索引 — 查詢加速的基石

MySQL 支援 B-Tree 索引 (預設)、全文索引、空間索引。每表最多 64 個索引 (InnoDB),單一索引最多 16 欄位 (MySQL 5.7+)。

建立索引語法


CREATE INDEX idx_username ON users(username);
-- 複合索引 (最左前綴原則)
CREATE INDEX idx_user_status ON users(username, status);

索引選擇性原則

  • 高選擇性 (基數大,如 UUID、Email、身分證) → 索引效果最好。
  • 低選擇性 (性別、狀態、布林) → 單獨索引效果差,可納入複合索引次序靠後。
  • 最左前綴:複合索引 (a,b,c) 可支援 a、a,b、a,b,c 查詢,不可跳過 a 直接用 b,c。

步驟 2:EXPLAIN — 透視執行計畫

實戰案例:查詢印度城市


EXPLAIN SELECT city.name, city.district
FROM city JOIN country ON city.countrycode = country.code
WHERE country.code = 'IND';

優化前 (city.countrycode 無索引)


| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra       |
|  1 | SIMPLE      | country | const| PRIMARY       | PRIMARY| 3     | const|    1 | Using index |
|  1 | SIMPLE      | city    | ALL  | NULL          | NULL | NULL    | NULL | 4079 | Using where |

建立索引


CREATE INDEX idx_countrycode ON city(countrycode);

優化後


| id | select_type | table   | type | possible_keys | key        | key_len | ref  | rows | Extra       |
|  1 | SIMPLE      | country | const| PRIMARY       | PRIMARY    | 3       | const|    1 | Using index |
|  1 | SIMPLE      | city    | ref  | idx_countrycode| idx_countrycode| 3   | const|  333 | Using where |

掃描行數從 4079 降至 333,**減少 91.8%**。

進階:覆蓋索引

若查詢僅需索引欄位,Extra 顯示 Using index,完全避免回表:


CREATE INDEX idx_ccode_name ON city(countrycode, name, district);
-- 查詢
SELECT name, district FROM city WHERE countrycode = 'IND';
-- Extra: Using index

步驟 3:關鍵配置參數調校

參數建議說明
innodb_buffer_pool_size專用機 60~80% RAMInnoDB 核心快取,命中率 > 99% 為佳
key_buffer_sizeMyISAM 為主時 20~25% RAMMyISAM 索引快取
table_open_cache4000+ (配合 max_connections)減少表定義開關開銷
sort_buffer_size / read_buffer_size4M~16M排序/全掃描緩衝,每執行緒分配,勿設過大
long_query_time0.5~1 秒慢查詢門檻,配合 slow_query_log
query_cache_typeOFF (MySQL 5.7+ 建議)查詢快取在高併發下常成熱點鎖

優化檢查清單

  1. ☐ 開啟慢查詢日誌 (slow_query_log=1, long_query_time=1)
  2. ☐ 定期分析 Top 10 慢查詢 (pt-query-digest)
  3. ☐ 對每條慢查詢執行 EXPLAIN
  4. ☐ 檢查 type 是否為 ALL/index (需優化)
  5. ☐ 檢查 rows 是否合理 (應遠小於總行數)
  6. ☐ 檢查 Extra 是否有 Using temporary/Using filesort
  7. ☐ 補齊索引、重寫 SQL、調整參數
  8. ☐ 壓測驗證 QPS、延遲、資源使用率

小結

「索引是矛,EXPLAIN 是盾,參數是內功」。系統化執行「慢查詢收集 → EXPLAIN 診斷 → 索引/SQL/參數 三位一體優化 → 壓測驗證」,是 MySQL 效能調優的黃金法則。切勿盲目加索引或調參數,必須以執行計畫與監控指標為依據。

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