索引法则--范围之后全失效

 

Mysql 系列文章主页 

 

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

 

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';

Case#2:name & age 且是等于

EXPLAIN SELECT * FROM staff where name = 'Alice' AND age = 22;

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的结果,如下:

  • type=range(注意上面三者全是 type=ref),已经劣了一级;
  • key_len=58(这和 Case#2 的相同),说明只有 name & age 两个索引生效,而后面的 pos 没有用上索引
  • ref=Null(前面全是 const)

3 结论

范围之后全失效——存储引擎不能使用索引中范围条件右边的列

 

posted @ 2018-04-24 14:32  cyhbyw  阅读(1101)  评论(1编辑  收藏  举报