MySql中的like和in走不走索引

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

Like
MySql中的like和in走不走索引_第1张图片
在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分析一下
MySql中的like和in走不走索引_第2张图片
很明显这条语句是走索引的。
这里有没有问题呢?我们把数据库中的数据做一下修改这行语句还会走索引吗?
我们将数据都修改为重复的,降低索引的区分度再试试。
MySql中的like和in走不走索引_第3张图片
再通过explain分析一下看结果
MySql中的like和in走不走索引_第4张图片
通过type列的ALL很明显看出这条语句已经不走索引了,因为此时数据库中email字段的区分度已经不支持123% 这种写法走索引了,所以使用的全表扫描。

接着来看第二种写法

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

先看测试数据
MySql中的like和in走不走索引_第5张图片
我们执行一下这行sql

SELECT * from t_user where email LIKE '%[email protected]'

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

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

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

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

MySQL的in条件走不走索引

你可能感兴趣的:(面试,学习路线,阿里巴巴,android,前端,后端)