索引法則--最佳左前綴法則


Mysql 系列文章主頁 

===============

最佳左前綴法則學習和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 總結

最佳左前綴法則:帶頭大哥不能死、中間兄弟不能斷

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM