Mysql联合索引,索引失效探究,索引下推原理分析。

我们都知道组合索引例如name_phone,名字和电话的组合索引,where name = xx and phone = 123这样严格的顺序才会使索引生效,像where phone = 123这样是不会走索引的。那么mysql是如何做的呢?

  1. 单值索引
    在这里插入图片描述
  2. 联合索引
    在这里插入图片描述
    从上图可以看到:
    B+Tree 会优先比较 name 来确定下一步应该搜索的方向,往左还是往右。
    如果 name相同的时候再比较 phone。

失效原因:
但是如果查询条件没有name,就不知道第一步应该查哪个节点,因为建立搜索树的时候name是第一个比较因子,所以用不到索引。

索引下推
正是因为有了联合索引,才会有索引下推的优化,避免多次扫描磁盘读取数据。
分析:where name like ‘L%’ and phone = 17;

一般先根据name=xx 找到数据,叶子节点找到主键id,然后查询到主键索引叶子节点的数据,再来筛选phone=17的结果。

使用索引下推的情况下,存储引擎层还是先根据 name like ‘L%’ 这个条件,查找到 LiLei、Lili、Lisa、Lucy 四条索引数据,不过接下来不是直接进行回表操作,而是根据 phone = 17 这个条件,对四条索引数据进行判断筛选,将符合条件的索引对应的 id 进行回表扫描,最终将找到的行数据返回给 server 层。(也就是我们把本应该在 server 层进行筛选的条件,下推到存储引擎层来进行筛选判断了。这个下推的前提是索引中有 age 列信息,如果是其它条件,如 gender = 0,这个即使下推下来也没用)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值