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 字段的值,所以还需要回表操作,再去主键索引中找到对应的记录

猜你喜欢

转载自blog.csdn.net/yzx3105/article/details/130428478