【mysql 5.7】儲存引擎不能使用索引中範圍條件右邊的列
阿新 • • 發佈:2021-01-05
技術標籤:mysql
概述
對於range查詢,在一條組合索引裡面,range欄位後面的列是不生效的,不會使用索引
1 準備資料
1.1 建表
DROP TABLE IF EXISTS staff;
CREATE TABLE IF NOT EXISTS staff (
id INT PRIMARY KEY auto_increment,
name VARCHAR(50),
age INT,
pos VARCHAR(50) COMMENT '職位',
salary DECIMAL(10,2)
);
1.2 插入資料
INSERT INTO staff( name, age, pos, salary) VALUES('Alice', 22, 'HR', 5000);
2 測試&Explain分析
2.1 建立索引
建立組合索引:
CREATE INDEX idx_nameAgePos ON staff(name, age, pos);
2.2 測試
Case#1:只有 name 且是等於
EXPLAIN SELECT * FROM staff where name = 'Alice';
注意key_len顯示使用了索引中的第一列
Case#2:name & age 且是等於
EXPLAIN SELECT * FROM staff where name = 'Alice' AND age = 22;
注意key_len顯示使用了索引中的第一列和第二列
Case#3:name & age & pos 且是等於
EXPLAIN SELECT * FROM staff where name = 'Alice' AND age = 22 AND pos = 'HR';
Case#4:name 是等於,age 不是等於(pos 其實已經使用不上索引了)
EXPLAIN SELECT * FROM staff where name = 'Alice' AND age > 21 AND pos = 'HR';
分析一下Case#4的結果,如下:
- type=range,
-注意上面三者全是 type=ref,已經劣了一級; - key_len=58(這和 Case#2 的相同),說明只有 name & age 兩個索引生效,而後面的 pos 沒有用上索引
- ref=Null(前面全是 const)
3 結論
範圍之後全失效——儲存引擎不能使用索引中範圍條件右邊的列
參考:
《索引法則–範圍之後全失效》