在MySQL性能調優領域,慢查詢診斷與優化始終是DBA與開發人員的核心課題。本文以真實生產環境中的慢查詢案例為切入點,結合EXPLAIN執行計劃深度解析與索引優化實戰,構建一套可複用的性能優化方法論。
一、慢查詢識別與定位:從日誌到監控
MySQL默認開啓慢查詢日誌(slow_query_log),通過long_query_time參數設置閾值(如2秒)。生產環境建議結合log_queries_not_using_indexes參數捕獲未走索引的查詢。實際案例中,某電商系統訂單查詢接口響應時間突增至5秒,通過慢日誌分析發現關鍵SQL:
SELECT * FROM orders WHERE user_id=1000 AND status='shipped' ORDER BY create_time DESC LIMIT 10;
該查詢涉及100萬級數據量,且未利用有效索引。
二、EXPLAIN執行計劃解析:從type到Extra字段
使用EXPLAIN分析上述SQL,重點關注以下核心字段:
- type列:反映訪問類型優先級(ALL<index<range<ref<eq_ref)。本例中type=ALL表示全表掃描。
- key列:顯示實際使用的索引。若顯示NULL則表示未使用索引。
- rows列:預估掃描行數。本例中rows=980000需重點優化。
- Extra列:關鍵提示如"Using filesort"(需額外排序)或"Using temporary"(需臨時表)。
通過EXPLAIN FORMAT=JSON可獲取更詳細的執行計劃細節,例如filtered值反映條件過濾效果,cost_info顯示執行成本。
三、索引優化實戰:從單列到複合索引
針對上述案例,設計複合索引優化方案:
ALTER TABLE orders ADD INDEX idx_user_status_time (user_id, status, create_time DESC);
優化後執行計劃顯示:
- type從ALL變為range,rows降低至1200
- Extra顯示"Using index condition",避免回表操作
- 實際執行時間從5秒降至0.2秒
複合索引設計需遵循最左前綴原則與基數原則。高基數字段(如user_id)應置於索引左側,時間範圍查詢字段置於末尾。通過SHOW INDEX FROM orders可驗證索引選擇性:
SELECT
INDEX_NAME,
CARDINALITY/COUNT(*) AS selectivity
FROM information_schema.STATISTICS
WHERE TABLE_NAME='orders'
GROUP BY INDEX_NAME;
選擇性接近1的索引更有效。
四、索引失效場景與規避策略
常見索引失效場景包括:
- 函數操作:
WHERE DATE(create_time)=CURDATE()應改為範圍查詢 - 隱式類型轉換:
WHERE user_id='1000'(若user_id為整型) - 模糊查詢:
WHERE name LIKE '%張%'導致索引失效 - OR連接:
WHERE user_id=1000 OR status='shipped'需改寫為UNION查詢
通過優化器提示SELECT /*+ INDEX(orders idx_user_status_time) */ ...可強制使用特定索引,但需謹慎使用。
五、進階優化:覆蓋索引與索引下推
覆蓋索引(Covering Index)允許查詢僅通過索引完成,無需回表。例如:
SELECT user_id, status FROM orders WHERE create_time > '2025-01-01';
若存在索引(create_time, user_id, status),則可完全通過索引樹獲取數據。
MySQL 5.6引入的索引下推(Index Condition Pushdown)特性,可在存儲引擎層過濾條件,減少回表次數。通過EXPLAIN輸出中的Using index condition可確認該特性生效。
六、監控與持續優化
結合Prometheus+Grafana構建慢查詢監控體系,通過slow_query_log日誌採集,配合pt-query-digest工具進行慢查詢分析。設置定時任務對innodb_buffer_pool_reads與innodb_buffer_pool_hit_rate進行監控,確保緩衝池命中率>99%。
結語
本文通過執行計劃解析與索引優化實戰,展示了從慢查詢識別到性能優化的完整流程。掌握EXPLAIN關鍵字段解析、複合索引設計原則、索引失效場景規避三大核心技能,配合持續監控體系,可系統性解決MySQL慢查詢問題。未來可探索直方圖統計、自適應索引等前沿優化技術,構建更智能的數據庫性能管理體系。