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

MySQL 索引使用決策指南:優化器選擇索引 vs 全表掃描的 10 條鐵律

     編輯:MySQL 綜合教學

優化器會使用索引的場景

  1. 範圍/等值匹配: WHERE col > 10, col >= 10, col = 10, col < 10, col <= 10, col IS NULL, col BETWEEN 10 AND 20。
  2. LIKE 前綴匹配: WHERE name LIKE 'abc%'(不以通配符開頭)。
  3. JOIN 關聯列: FROM t1 JOIN t2 ON t1.col = t2.key_col(被驅動表關聯列有索引)。
  4. 聚合函數極值: SELECT MIN(key2), MAX(key2) FROM t WHERE key1 = 10(索引順序掃描首/尾)。
  5. ORDER BY / GROUP BY 索引前綴: ORDER BY key1, key2, key3(索引順序輸出,無 FileSort)。
  6. 覆蓋索引: SELECT key3 FROM t WHERE key1 = 1(查詢列全部在索引中,回表)。

優化器拒絕索引(選擇全表掃描)的場景

  1. 掃描比例過高: WHERE key1 > 1 AND key1 < 90(覆蓋 90% 數據),優化器判斷全表掃描更快(順序 I/O vs 隨機 I/O)。
  2. HEAP 表非等值查詢: ENGINE=MEMORY 僅支持 =/<=> 走 HASH 索引。
  3. HEAP 表 ORDER BY: 內存表無物理順序,必然 FileSort。
  4. 非最左前綴: WHERE key2 = 1(複合索引 (key1, key2) 無法利用)。
  5. LIKE 通配符開頭: WHERE name LIKE '%abc%'(B+樹無法前綴定位)。
  6. 索引列查詢但 ORDER BY 非索引列: WHERE key1 = 1 ORDER BY key2(檢索用 key1,排序需臨時表)。

實戰判斷工具

EXPLAIN SELECT * FROM t WHERE key1 = 1 ORDER BY key2;
-- 關鍵列:
-- type: ref/range/ALL (ALL=全表掃描)
-- key: 實際使用的索引名
-- rows: 預估掃描行數
-- Extra: Using where / Using index / Using filesort / Using temporary

強制/忽略索引(慎用)

SELECT * FROM t FORCE INDEX (idx_key1) WHERE key1 = 1;
SELECT * FROM t IGNORE INDEX (idx_key1) WHERE key1 = 1;

僅作臨時干預,**根治需修正統計信息 ANALYZE TABLE 或重寫 SQL/調整索引**。

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