===============
最佳左前綴法則學習和Demo演示
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); INSERT INTO staff(name, age, pos, salary) VALUES('Bob', 22, 'RD', 10000); INSERT INTO staff(name, age, pos, salary) VALUES('David', 22, 'Sale', 120000);
2 測試&Explain分析
2.1 創建索引
CREATE INDEX idx_nameAgePos ON staff(name, age, pos);
創建了一個基於 name, age, pos 三個字段的索引
2.2 索引測試
Case#1:只根據 name 字段來查詢
EXPLAIN SELECT * FROM staff WHERE name = 'Alice';
結果:
- type=ref
- key=索引
- ref=const
- ken_len=53
Case#2:只根據 name & age 字段來查詢
EXPLAIN SELECT * FROM staff WHERE name = 'Alice' AND age = 22;
結果:和 Case#1 差不多,但是:
- key_len=58
- ref=const, const
Case#3:根據 name & age & pos 來查詢
EXPLAIN SELECT * FROM staff WHERE name = 'Alice' AND age = 22 AND pos = 'HR';
結果:索引仍然生效,同時,key_len & ref 比 Case#2 中的結果更豐富
Case#4:根據 age & pos 來查詢
EXPLAIN SELECT * FROM staff WHERE age = 22 AND pos = 'HR';
結果:沒有索引,全表掃描
Case#5:根據 name & pos 來查詢
EXPLAIN SELECT * FROM staff where name = 'Alice' AND pos = 'HR';
結果:和 Case#1 相同(說明 pos 字段沒有用上索引)
3 總體分析
Case1,2,3都用了上索引,且使用索引長度依次增加(key_len=53,58,111 且 ref=1個const,2個const,3個const),符合最佳左前綴法則;
Case4中沒有帶頭大哥(火車頭),於是,全表掃描;
Case5中只有 name 字段使用上了索引,中間兄弟(中間車廂)age 斷了,於是,后面的兄弟(車廂)pos 掛了;
4 總結
最佳左前綴法則:帶頭大哥不能死、中間兄弟不能斷