SQL 優化是 DBA 核心日常工作。面對海量慢查詢,如何高效、標準化地完成「執行計劃分析 → 統計信息收集 → 參數調優 → 性能剖析」全流程?本文系統梳理 MySQL 優化核心命令,並介紹一款 Python 自動化工具,實現一鍵輸出優化全景圖,大幅提升排查效率。
MySQL 不緩存執行計劃,每次皆為「硬解析」,EXPLAIN 為核心切入點。
EXPLAIN QUERY:基礎輸出,顯示連接順序、類型EXPLAIN EXTENDED QUERY + SHOW WARNINGS:查看優化器重寫後的 SQL(如子查詢轉 JOIN)EXPLAIN PARTITIONS QUERY:分區表訪問分區情況(5.1+)EXPLAIN FORMAT=JSON:JSON 格式輸出,含關聯細節(5.6+)| 字段 | 含義 | 優化關注點 |
|---|---|---|
| id | 查詢序列號 | 子查詢/衍生表導致 id 複雜 |
| select_type | 查詢類型 | SIMPLE/PRIMARY/SUBQUERY/DERIVED/UNION 等 |
| table | 訪問表/衍生表 | 關注別名與臨時表 |
| type | 訪問策略 | system > const > eq_ref > ref > range > index > ALL,避免 ALL |
| possible_keys | 候選索引 | 為 NULL 表明無索引可用 |
| key | 實際使用索引 | 與 possible_keys 對比,看優化器選擇 |
| key_len | 索引長度 | 判斷聯合索引用了幾列 |
| rows | 預估掃描行數 | 越小越好,結合 filtered 看實際過濾率 |
| Extra | 附加信息 | Using index(覆蓋索引)、Using where、Using temporary/filesort(需優化) |
| filtered | 條件過濾率估算 | 僅 EXTENDED 顯示,越高越好 |
SHOW TABLE STATUS —— 行數、數據/索引長度、自增值、更新時間等SHOW INDEX —— Cardinality(基數)、索引類型、前綴長度等sort_buffer_size:排序緩衝,單線程,大排序+高併發慎加大join_buffer_size:Join 緩衝,僅非索引連接使用,單線程獨佔tmp_table_size:內存臨時表上限,超限轉 MyISAM 落盤read_buffer_size:順序讀緩衝,單線程optimizer_search_depth:窮舉深度,長時間「statistics」狀態可調低optimizer_prune_level:啟用啟發式剪枝(預設開)optimizer_switch:功能開關集合,如 index_condition_pushdown=on/off(ICP 特性)可干預索引條件下推執行 SQL 前後各執行一次 SHOW SESSION STATUS,對比差值定位資源消耗。關鍵指標:
Handler_read_rnd_next:高表明全表掃描嚴重Sort_merge_passes:高建議增大 sort_buffer_sizeHandler_read_key:高說明索引利用良好SET profiling=1;
SELECT ...;
SHOW PROFILES; -- 列出所有 Query 概要
SHOW PROFILE FOR QUERY 1; -- 單條 Query 詳細階段耗時
SHOW PROFILE CPU,BLOCK IO FOR QUERY 1; -- 指定資源維度
可獲取 CPU、IO、IPC、Page Faults、Context Switches 及函數級調用堆棧。
MySQLdb、sqlparsepython mysql_tuning.py -p tuning_sql.ini -s 'SELECT ...'
-p:配置文件-s:目標 SQL[database]
server_ip = 127.0.0.1
db_user = testuser
db_pwd = testpwd
db_name = test
[option]
sys_parm = ON # 系統參數
sql_plan = ON # 執行計劃
obj_stat = ON # 表/索引統計
ses_status = ON # 會話狀態對比(會真實執行 SQL)
sql_profile = ON # Profile 追蹤(會真實執行 SQL)
optimizer_switch 明細EXPLAIN EXTENDED 輸出SHOW WARNINGS 產出的重寫語句SHOW STATUS 差值(含誤差提示)pt-query-digest、sys schema 等生態工具掌握 EXPLAIN 深度解讀、統計信息收集、參數與優化器干預、SHOW STATUS 差值分析、Query Profiler 多維剖析,構成 MySQL SQL 優化的「五大金剛」。配合 Python 自動化工具,可將單條優化耗時從分鐘級壓縮至秒級,實現標準化、可複用的優化交付流程。建議 DBA 以此為基礎,持續沉澱優化案例庫,打造個人/團隊優化知識體系。