索引使用规则1——最左前缀法则

这篇文章主要介绍索引的使用规则——最左前缀法则,关于索引的效率,可以查看上一篇文章索引的有效性

最左前缀法则:索引使用了复合索引,也就是联合索引,使用一个索引名称索引了好几个字段。在这类索引中需要遵守最左前缀法则最左前缀法则指的是查询从索引的最左列开始(必须包含最左列),并且不跳过索引的列。如果跳跃了某一列,索引失效(后面索引的字段都失效)。具体我们举个例子

目录

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,说明只要最左列存在且没有出现跳跃的情况的时候,顺序无关紧要

  • 54
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值