SQL优化之like做模糊查询的时候真的用不到索引吗?
平时在面试的时候当贝问到SQL优化的经验的时候,我见过很多会有这个说法:一条SQL语句中如果使用Like做模糊查询的时候如果Like的条件字段有索引的话是用不到索引的,但是如果允许的情况下我们使用后置统配 的方式是可以用到索引的,真实的情况真的是这样的吗?伟大领袖毛主席告诉我们说:“实践是检验真理的唯一标准”,下面我们看看实际的情况是咋样的
真实的情况是这样的:
实验中我准备了一张有1060W数据的user_info表,创建的索引如下图所示

下边开始进行操作:
1、执行下边语句
explain select * from user_info where address like ‘%浙江省保%’ 这样确实用不到 索引

2、如果我们换成 后统配的方式 ‘浙江省保%’ 这样可以用到索引吗?

3、是不是前后统配 ‘%浙江省保%’ 的方式就一定用不到索引呢?

为什么会有 1中和 3中的区别呢?
答案是 1中因为返回的数据是 * 也就是全字段的返回,但是3中返回的是 address 字段,也就是索引的字段,其实这时候 因为只返回索引字段,这时候address_index 索引其实是相当于一个 覆盖索引,数据直接可以从索引上直接返回 , 所以也就能用到索引啦,而且也不需要再进行表的二次回表查询,所以在SQL优化的时候 可以去掉没有用的字段,对需要返回的字段构建全字段的 联合索引 可以提升表的查询效率
4、看到这里对SQL优化经验比较少的人可能会对上边的 一些概念比较模糊,这里就普及一下吧
覆盖索引:通俗的数 索引的字段数和返回数据的字段数相等,那么这个索引就可以称为覆盖索引
**回表:**通俗的说就是通过索引找到数据行的主键,然后得到主键后再根据主键索引找到对应的完整数据行返回就叫 回表,一般回表因为多查询了一遍主键索引会导致查询速度的下降,一般我们创建的索引(不包括主键索引)都是二级索引这些都会导致回表操作,要想避免的话可以根据需要只返回索引中包含的字段,这样就可以避免回表了,另外补充一下我们创建的索引都会包含主键信息的,即便是你创建索引的时候没有在索引中添加主键字段的信息但是数据库会在创建索引的时候自己加上去的
5、再额外的补充一下(网上一些资料显示一个表查询只会用到一个索引这种的表述是有误的):因为MySQL5.0之前一个表查询只可以用到表上的单个索引,但是5.0之后添加了索引合并的功能,也就是可以用到多个索引了
6、同志们觉的我写的不错的,请帮我点个赞,您的赞是我写出更加优秀文章的动力 _
本文通过实验验证了在SQL中,Like模糊查询的索引使用情况,并揭示了后置通配符能利用索引的原理,介绍了覆盖索引和回表的概念,以及MySQL索引合并的影响。

1030

被折叠的 条评论
为什么被折叠?



