1. 程式人生 > 其它 >【mysql 5.7】儲存引擎不能使用索引中範圍條件右邊的列

【mysql 5.7】儲存引擎不能使用索引中範圍條件右邊的列

技術標籤: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 結論

範圍之後全失效——儲存引擎不能使用索引中範圍條件右邊的列

參考:
《索引法則–範圍之後全失效》