EXPLAIN 輸出的 rows、filtered、key 等往往與實際執行偏差巨大,導致優化方向錯誤。本文梳理核心原因與緩解手段。
information_schema.TABLES/STATISTICS 非實時,默認每 10 秒或 1/16 表變更時後台更新。ANALYZE TABLE t; 手動更新統計;關鍵表設置 innodb_stats_persistent=ON + innodb_stats_auto_recalc=ON;大表適當降低 innodb_stats_sample_pages 提高採樣精度。io_cost/cpu_cost)基於傳統 HDD 校準,SSD/NVMe 隨機讀寫成本遠低於順序,導致優化器傾向全表掃描而非索引查找。mysql.server_cost/mysql.engine_cost 表可調整成本常數;或使用 FORCE INDEX 強制走索引。optimizer_switch 開關(如 index_merge, mrr, batched_key_access)改變優化器行為。join_buffer_size、sort_buffer_size 影響 Block Nested Loop / 排序成本估算。STRAIGHT_JOIN 固定 JOIN 順序、物化中間結果到臨時表。ANALYZE TABLE ... UPDATE HISTOGRAM)未收集或桶數不足,無法識別熱點值。FORCE INDEX 繞過誤判。EXPLAIN ANALYZE(8.0.18+)獲取實際執行時間、循環次數、I/O,對比靜態估算。ANALYZE TABLE(低峰期)。engine_cost。EXPLAIN ANALYZE 驗證實際 vs 估算。FORCE INDEX / STRAIGHT_JOIN 干預優化器。optimizer_trace 觀察優化器決策路徑(調試用)。執行計劃是基於統計信息與成本模型的靜態估算,而非運行時真相。建立「統計維護 -> 計劃驗證 -> 干預優化」閉環,才能在不準確的計劃中做出正確優化決策。