MySQL中的LIKE查询能否用的到索引

单列索引

使用 like x% 查询是可以用得到索引的,而使用 like %x% 和 like %x 查询是用不到索引的

那么使用 like %x% 和 like %x 查询为什么用不到索引?
因为索引是一种有序的 B+ Tree数据结构,叶子节点都是按照顺序从左向右排的,如果使用 like %x% 和 like %x查询的话,不知道开头是哪个,就会去进行全表扫描,这样就很好理解了

组合索引

将字段 username 和 age 两个字段作为联合索引,命名为 index_username_age。

使用 like x%

在这里插入图片描述
从 EXPLAIN 执行计划中,可以看到使用 like x% 查询用到了 index_username_age 这个联合索引,这个 type 为 range 表示这是一个索引的范围扫描(因为是模糊匹配,而模糊匹配可以形成扫描区间),Extra 为 Using where;Using index,表示用到了索引,但是还需要进行过滤

使用 like %x%

在这里插入图片描述

使用 like %x

在这里插入图片描述
从使用 like %x% 和 like %x 的执行计划来看,它们的 type 均为 index,说明它遍历了索引 B+ Tee,Extra 为 Using where;Using index,表示用到了索引,但是还需要进行过滤

那么使用 like %x% 和 like %x 查询时,为什么它需要遍历整颗索引 B+ Tee?因为对于联合索引 index_username_age 来说,它是以 username 字段来创建维护的索引 B+ Tee,自然而然在叶子节点中 username 字段是有序排列的,而 age 字段是无序的,只有在 username 字段相同的情况下,age 字段才是有序的;如此如果使用 like %x% 和 like %x 查询的话,不知道开头是哪个,就会去进行全表扫描。

结论

使用 like x%
在联合索引中,使用 like x% 查询是可以用到索引的,无论是使用覆盖索引还是查询所有的字段,它都是可以使用到索引的,提高查询效率的。
使用 like %x% 和 like %x
使用覆盖索引:虽然用到了索引,但它是需要遍历整颗索引 B+ Tee 的,然后过滤出满足条件的数据
查询所有字段:此时它需要读取遍历联合索引 index_username_age 整颗索引 B+ Tee,然后过滤出满足条件的数据,由于联合索引中没有保存 address 字段的值,所以还需要回表操作,再去主键索引中找到对应的记录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值