【MySQL45讲】day3.深入浅出索引(下)

一、覆盖索引

        比如此时表t中有id、name、age三个字段,id是主键,默认为主键索引,name上有常规索引。此时执行select * from t where name='张三',这时我们的索引使用情况是什么样的?首先走name上的二级索引,查到索引中存储的主键值,然后拿着这个主键值去主键索引中查询整行数据,然后返回。可以看到,此时我们走了两次索引树,造成了回表查询,为了避免回表查询,我们可以不查询*,这里直接查询主键id,因为二级索引中存储的数据就是主键,所以这样只会走一次索引树,这就是覆盖索引。覆盖索引可以提高查询效率,避免回表查询。

二、最左前缀法则

        innodb也支持建立联合索引,但要遵循最左前缀法则,例如我们建立索引(name,age),那么在查询的where后,有name和age时会走索引,只有name时会走索引,只有age时不会走索引。

三、索引下推

        在使用联合索引时,如果不满足最左前缀的部分该怎么办呢?

        例如此时执行select * from t where name='张%' and age=10,此时会走联合索引(name,age),在mysql5.6之前是不比较age的,而是先把符合'张%'的数据取出来,然后到主键索引上找数据行一个个进行比较。

         在mysql5.6之后,此时会在查询满足name字段的同时,也会查询age是否满足,这时返回主键值,再根据主键值去进行回表,减少了回表的次数。        ​​​​

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值