mysql如何优化联合索引abc使用

mysql 之前有讲述过关于索引的分类以及应用mysql索引应用本篇则主要是针对联合索引abc来进行实践操作说明。
大家想找employees数据包可以查看如上链接博客。

一、数据背景

创建一个联合索引abc
在这里插入图片描述
索引的type以及length如下:
在这里插入图片描述

二、key-len列的计算规则

在这里插入图片描述

三、SQL执行测试

1)sql执行 a,b,c字段都存在

1>abc执行

explain select * from employees where uid=4 and first_name=“Cristinel” and last_name=“Haddadi”
在这里插入图片描述
type为ref,证明走索引了,key_len=42,我们可以计算一下。uid的type为bigint,所以就是8个字节。first_name和last_name均为varchar类型那么就是n+2,也就是14+2+16+2=34+8=42.

explain select * from employees where first_name=“Cristinel” and uid=“4” and last_name=“Haddadi”
在这里插入图片描述

explain select * from employees where uid=“4” and last_name=“Haddadi” and first_name=“Cristinel”
在这里插入图片描述
key_len都是42,所以都走了全索引

2)sql执行 a,b,c部分索引字段为查询条件

1>ac执行

explain select * from employees where uid=“4” and last_name=“Haddadi”
在这里插入图片描述我们发现key_len=8,也就是只使用了uid索引,last_name索引未生效。

2> ba执行

explain select * from employees where first_name=“Cristinel” and uid=“4”这里是引用
我们通过计算key_len计算可以发现,14+2+8=24,他走了两个索引,ab都使用到了。

3)针对条件,优化索引

曾经遇到这样一个问题,需要满足两个查询语句
select * from A where a=a and b=b and c=c;
select * from A where a=a and c=c;
该如何建立索引呢?

那如果继续a,b,c肯定不满足语句2全部走索引。所以我们改变一下,改为a,c,b索引则均可以满足以上的两个需求。
在这里插入图片描述
如上图,我重新设置了一个索引a,c,b模式,通过如上的测试我们可以判定肯定满足如上的语句了。
1>a,b,c执行

explain select * from employees where uid=“4” and first_name=“Cristinel” and last_name=“Haddadi”
在这里插入图片描述

2>a,c执行

explain select * from employees where uid=4 and last_name=“Haddadi”
在这里插入图片描述
key_len:16+2+8=26,索引都用到了。

四、总结

最左前缀原则,通过以上我们可以总结出,只要联和索引的字段都参与了查询,那么不管前后顺序,都是可以直接走索引的。
若表中索引过多,会影响INSERT及UPDATE性能,简单说就是会影响数据写入性能。因为更新数据的同时,也要同时更新索引。
所以能一个索引完成工作,肯定不建议建立两个。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值