今天我们来实际操作一下
首先我们创建一个用户表进行测试

Like
在这里插入图片描述
在email字段上加一个索引来测试Like关键字
在这里插入图片描述
我们先来复习一下Like语句的几种写法
往大的方向说Like语句由两种写法,分别时%和_。
%:用来匹配若干个字符的出现形式(也可以是0个)
_:用来匹配单个字符的出现形式
工作中我们主要的模糊查询也是%,我们重点来看一个Like的几种写法

  1. select * from t_user where email like ‘你所知道的字符%’
  2. select * from t_user where email like ‘%你所知道的字符’
  3. select * from t_user where email like ‘%你所知道的字符%’
    我们分别来看一下这三种走索引的情况
    先来看第一种写法
select * from t_user where email like '你所知道的字符%'

使用explain分析一下
在这里插入图片描述
很明显这条语句是走索引的。
这里有没有问题呢?我们把数据库中的数据做一下修改这行语句还会走索引吗?
我们将数据都修改为重复的,降低索引的区分度再试试。
在这里插入图片描述
再通过explain分析一下看结果
在这里插入图片描述
通过type列的ALL很明显看出这条语句已经不走索引了,因为此时数据库中email字段的区分度已经不支持123% 这种写法走索引了,所以使用的全表扫描。

接着来看第二种写法

select * from t_user where email like '%你所知道的字符'

先看测试数据
在这里插入图片描述
我们执行一下这行sql

SELECT * from t_user where email LIKE '%6@qq.com'

大家可以停下来想一下会不会走索引,注意我写的sql和数据库的数据。这条sql查询的目标数据在数据库中的区分度是没问题的,而且email字段也是有索引的,按理说这条语句肯定会走索引的。
我们来看下explain的分析结果
在这里插入图片描述
从结果来看是不走索引的,其实这跟mysql的索引组织结构有关系。
%加在前面mysql是无法使用索引查询的,因为mysql不知道%代表多少字符,所以就只能走全表扫描了。

第三种写法其实跟第二种写法是一样的,也属于%在前面的一种,同样也不会走索引。

In
in走不走索引这个和条件后面的数据量有关系,当数据量较小的时候是会走索引的,而当in后面跟的数据量较大的时候就会走全表扫描。mysql底层对于后面的条件很可能做了数据重复处理;参考别人博客解释道条件范围占总数据的30%左右的时候会进行全表扫描,放弃执行索引的方式;里面可能还涉及到对后面的数据去重之后的结果占比的判定!

详细的大家可以看下这篇博客,讲的还是很详细的。

MySQL的in条件走不走索引

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐