这篇文章主要介绍索引的使用规则——最左前缀法则,关于索引的效率,可以查看上一篇文章索引的有效性
最左前缀法则:索引使用了复合索引,也就是联合索引,使用一个索引名称索引了好几个字段。在这类索引中需要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始(必须包含最左列),并且不跳过索引的列。如果跳跃了某一列,索引失效(后面索引的字段都失效)。具体我们举个例子
目录
1、首先我们创建一张表
2、创建一个联合索引(复合索引)
3、查看索引
4、查看执行计划以及执行性能(explain)
4.1、从表里面查询name='码云' and phone='18800808888' and age='55'的信息
4.2、从表里面查询 name='码云' and phone='18800808888'的信息
4.3、查询name=码云的信息
4.4、不使用最左列的name查询phone和age
4.5、跳跃phone查询name=码云age=55的信息
4.6、三个字段都存在,但是顺序不一样的时候
1、首先我们创建一张表
create table tb_user(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '姓名',
profession varchar(10) comment '专业',
age int comment '年龄',
gender char(1) comment '1:男,2:女',
phone char(11) comment '手机号',
email char(11) comment '邮件'
)comment '用户基本信息表';
insert into tb_user(id,name,profession,age,gender,phone,email) values
(null,'黄渤','教授',45,'1','18800801111','3333@qq.com'),
(null,'冰冰','学生',35,'2','18800002222' ,'4444@qq.com'),
(null,'码云','老板',55,'1','18800008888' ,'5555@qq.com'),
(null,'李彦宏','总裁',50,'1','18800009999','6666@qq.com');
2、创建一个联合索引(复合索引)
将tb_user表里面的name,phone,age字段都索引上
create index index_user_search on tb_user(name,phone,age);
3、查看索引
show index from tb_user;
4、查看执行计划以及执行性能(explain)
4.1、从表里面查询name='码云' and phone='18800808888' and age='55'的信息
explain select * from tb_user where name='码云' and phone='18800808888' and age='55';
可以看到type=ref说明没有进行全表查询,走了索引,key_len=93
4.2、从表里面查询 name='码云' and phone='18800808888'的信息
explain select * from tb_user where name='码云' and phone='18800808888';
可以看到type=ref说明没有进行全表查询,走了索引。key_len=88,说明age的长度为5
4.3、查询name=码云的信息
explain select * from tb_user where name='码云';
可以看到type=ref说明没有进行全表查询,走了索引,key_len=43,说明name的长度为43,phone的长度为45
4.4、不使用最左列的name查询phone和age
explain select * from tb_user where phone='18800808888' and age='55';
可以看到type=All说明进行全表查询,没有走索引。且key_len=NULL
4.5、跳跃phone查询name=码云age=55的信息
explain select * from tb_user where name='码云' and age='55';
可以看到type=ref说明没有进行全表查询,走了索引。但是但是key_len=43,与4.3的key_len的长度一样。可见没有走后面的索引
4.6、三个字段都存在,但是顺序不一样的时候
explain select * from tb_user where name='码云' and age='55' and phone ='18800808888';
explain select * from tb_user where phone ='18800808888' and age='55' and name='码云';
explain select * from tb_user where age='55' and phone ='18800808888' and name='码云';
可以看到type=ref说明没有进行全表查询,走了索引。key_len=93,说明只要最左列存在且没有出现跳跃的情况的时候,顺序无关紧要