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

MySQL 查詢優化器工作原理深度解析:索引選擇、常數折疊、EXPLAIN 實戰

     編輯:MySQL 綜合教學

優化器核心目標

MySQL 查詢優化器(Query Optimizer)單一核心目標:**以最小代價找到符合條件的行**。核心策略:盡可能使用索引,並選擇最嚴格(選擇性最高)的索引,儘早過濾掉不符合條件的行。

常數折疊與不可能條件檢測

-- 優化器識別 WHERE 0 永假,直接返回空結果,不掃描表
EXPLAIN SELECT * FROM tbl_name WHERE 0\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: NULL
type: NULL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: NULL
Extra: Impossible WHERE

索引選擇邏輯:選擇性計算

假設查詢:

SELECT col3 FROM mytable
WHERE col1 = 'value1' AND col2 = 'value2';
-- col1、col2 均有索引

優化器估算:

  • col1 = 'value1' 匹配 900 行(選擇性 900/總行數)
  • col2 = 'value2' 匹配 300 行(選擇性較高)
  • 聯合匹配 30 行

決策:優先用 col2 索引讀取 300 行,再回表過濾 col1,僅 270 次失敗;若先用 col1 則 870 次失敗。優化器選擇代價更小的 col2 索引。

輔助優化器的最佳實踐

  1. 統一比較欄位數據類型:INT vs BIGINT、CHAR(10) vs VARCHAR(10) 視為相容,但 CHAR(10) vs CHAR(12) 會阻礙索引使用
    -- 惡例:隱式轉換導致索引失效
    WHERE varchar_col = 123;  -- 數值與字串比較
    -- 良例:統一類型
    WHERE varchar_col = '123';
  2. 收集統計資訊:ANALYZE TABLE tbl_name; 更新索引基數,幫助優化器準確估算 rows
  3. 使用 EXPLAIN 驗證:關注 type(目標 ref/eq_ref/range)、key(實際用索引)、rows(預估掃描行)、Extra(Using index/where/temporary/filesort)
  4. 必要時強制索引:FORCE INDEX (idx_name)、IGNORE INDEX (idx_name)、USE INDEX (idx_name)(謹慎使用,優化器通常更聰明)

EXPLAIN 關鍵欄位深度解讀

欄位含義優秀值警示值
id查詢序號--
select_type查詢類型SIMPLEDEPENDENT SUBQUERY, UNCACHEABLE SUBQUERY
table訪問的表-<derivedN>, <subqueryN>
partitions匹配分區具體分區名ALL (全分區掃描)
type訪問類型(關鍵)system > const > eq_ref > ref > range > index > ALLALL (全表掃描)
possible_keys理論可用索引-NULL (無索引可用)
key實際使用索引具體索引名NULL (未用索引)
key_len使用索引長度盡可能長(複合索引前綴)過短(未用完整複合索引)
ref關聯比較依據const, func, col_name-
rows預估掃描行數接近實際返回行數遠大於返回行數
filtered條件過濾比例100%< 10%
Extra額外資訊Using index, Using whereUsing temporary, Using filesort, Using join buffer

優化器限制與人工干預場景

  1. 範圍優化器:IN 列表過長(> range_optimizer_max_mem_size)會退化為全表掃描
  2. 關聯順序:優化器單向動態規劃搜尋最優 JOIN 順序,表數 > optimizer_search_depth(預設 62)時改用貪婪演算法
  3. 直方圖統計:8.0+ 支援 ANALYZE TABLE ... UPDATE HISTOGRAM 解決非均勻分布估算偏差

延伸閱讀

  • MySQL 無重複查詢的實現
  • MySQL 中 SELECT 命令的特殊用法
  • 使用 Limit 參數實現 MySQL 查詢優化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved