今天我们来实际操作一下
首先我们创建一个用户表进行测试
Like
在email字段上加一个索引来测试Like关键字
我们先来复习一下Like语句的几种写法
往大的方向说Like语句由两种写法,分别时%和_。
%:用来匹配若干个字符的出现形式(也可以是0个)
_:用来匹配单个字符的出现形式
工作中我们主要的模糊查询也是%,我们重点来看一个Like的几种写法
- select * from t_user where email like ‘你所知道的字符%’
- select * from t_user where email like ‘%你所知道的字符’
- 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@'
大家可以停下来想一下会不会走索引,注意我写的sql和数据库的数据。这条sql查询的目标数据在数据库中的区分度是没问题的,而且email字段也是有索引的,按理说这条语句肯定会走索引的。
我们来看下explain的分析结果
从结果来看是不走索引的,其实这跟mysql的索引组织结构有关系。
%加在前面mysql是无法使用索引查询的,因为mysql不知道%代表多少字符,所以就只能走全表扫描了。
第三种写法其实跟第二种写法是一样的,也属于%在前面的一种,同样也不会走索引。
In
in走不走索引这个和条件后面的数据量有关系,当数据量较小的时候是会走索引的,而当in后面跟的数据量较大的时候就会走全表扫描。mysql底层对于后面的条件很可能做了数据重复处理;参考别人博客解释道条件范围占总数据的30%左右的时候会进行全表扫描,放弃执行索引的方式;里面可能还涉及到对后面的数据去重之后的结果占比的判定!