首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 5.1.48 優化器改進:叢集主鍵不再優先用於覆蓋索引掃描

     編輯:MySQL 資料庫相關知識

版本變更背景

MySQL 5.1.46 引入 find_shortest_key 函數,改變覆蓋索引掃描的索引選擇邏輯。核心變化:InnoDB 叢集主鍵不再被優先考慮,改為選擇 key_len 最小的輔助索引。

原理深度解析

  • MyISAM:主鍵非叢集,葉節點存行指標,主鍵較窄時適合全索引掃描
  • InnoDB:主鍵叢集,葉節點存完整行資料(含隱藏列 DB_TRX_ID、DB_ROLL_PTR,約 20 字節開銷),掃描主鍵即掃描全表
  • find_shortest_key 邏輯:若 Primary_key_is_clustered() == true,跳過主鍵,選擇最短的輔助覆蓋索引

實測驗證過程

5.1.45 版本行為

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)

5.1.48 版本行為

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.451.294 秒1.293 秒
5.1.481.178 秒1.177 秒

掃描資料量減少約 9%,CPU 佔用同比下降。

實務啟示

  1. InnoDB 表設計時,刻意建立窄輔助索引可加速全表聚合查詢
  2. 主鍵宜用 BIGINT AUTO_INCREMENT,避免複合主鍵或長字串主鍵導致輔助索引膨脹
  3. SHOW INDEX 觀察 Cardinality 與 key_len 是優化判斷關鍵
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved