MySQL 5.1.46 引入 find_shortest_key 函數,改變覆蓋索引掃描的索引選擇邏輯。核心變化:InnoDB 叢集主鍵不再被優先考慮,改為選擇 key_len 最小的輔助索引。
DB_TRX_ID、DB_ROLL_PTR,約 20 字節開銷),掃描主鍵即掃描全表find_shortest_key 邏輯:若 Primary_key_is_clustered() == true,跳過主鍵,選擇最短的輔助覆蓋索引CREATE TABLE test(id INT, name VARCHAR(20), name2 VARCHAR(20), d DATETIME, PRIMARY KEY(id)) ENGINE=InnoDB; ALTER TABLE test ADD INDEX ind_1(name, d); ALTER TABLE test ADD INDEX ind_2(d); EXPLAIN SELECT COUNT(*) FROM test; -- 使用 PRIMARY (key_len=4)
EXPLAIN SELECT COUNT(*) FROM test; -- 僅有 ind_1 時用 ind_1 (key_len=52) -- 加入 ind_2 後 EXPLAIN SELECT COUNT(*) FROM test; -- 改用 ind_2 (key_len=9),選擇更短索引
| 版本 | Sending data 耗時 | CPU 時間 |
|---|---|---|
| 5.1.45 | 1.294 秒 | 1.293 秒 |
| 5.1.48 | 1.178 秒 | 1.177 秒 |
掃描資料量減少約 9%,CPU 佔用同比下降。
BIGINT AUTO_INCREMENT,避免複合主鍵或長字串主鍵導致輔助索引膨脹SHOW INDEX 觀察 Cardinality 與 key_len 是優化判斷關鍵