MySQL 不總是正確選擇索引。理解**選擇性** 是優化查詢關鍵。
CREATE TABLE r2 (
id INT(11) DEFAULT NULL,
id1 INT(11) DEFAULT NULL,
cname VARCHAR(32) DEFAULT NULL,
KEY id1 (id1)
) ENGINE=MyISAM;
SELECT COUNT(*) FROM r2; -- 250001 (V1)
SELECT COUNT(*) FROM r2 WHERE id1=1; -- 83036 (V2)
選擇性 = V2 / V1 = 0.3321 (33.21%)
EXPLAIN SELECT COUNT(cname) FROM r2 WHERE id1=1;
-- 結果顯示 type=ref, key=id1, rows=81371, Extra=Using where
-- MySQL 選擇了索引,即使選擇性 33% > 25%
需進一步對比 SELECT COUNT(*) (全表掃描) 與 SELECT COUNT(cname) (索引掃描) 的實際執行時間,驗證優化器決策是否最優。
關鍵啟示: MySQL 優化器對選擇性閾值判斷較保守,高選擇性查詢可能仍走索引,導致效能不如全表掃描。必要時可用 FORCE INDEX、IGNORE INDEX 或重寫查詢引導優化器。