当前位置:网站首页>MySql中的like和in走不走索引
MySql中的like和in走不走索引
2022-08-02 02:57:00 【emgexgb_sef】
今天我们来实际操作一下
首先我们创建一个用户表进行测试
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 '%[email protected]'
大家可以停下来想一下会不会走索引,注意我写的sql和数据库的数据。这条sql查询的目标数据在数据库中的区分度是没问题的,而且email字段也是有索引的,按理说这条语句肯定会走索引的。
我们来看下explain的分析结果
从结果来看是不走索引的,其实这跟mysql的索引组织结构有关系。
%加在前面mysql是无法使用索引查询的,因为mysql不知道%代表多少字符,所以就只能走全表扫描了。
第三种写法其实跟第二种写法是一样的,也属于%在前面的一种,同样也不会走索引。
In
in走不走索引这个和条件后面的数据量有关系,当数据量较小的时候是会走索引的,而当in后面跟的数据量较大的时候就会走全表扫描。mysql底层对于后面的条件很可能做了数据重复处理;参考别人博客解释道条件范围占总数据的30%左右的时候会进行全表扫描,放弃执行索引的方式;里面可能还涉及到对后面的数据去重之后的结果占比的判定!
详细的大家可以看下这篇博客,讲的还是很详细的。
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢
随机推荐
JS中获取对象数据类型的键值对的键与值
WebShell connection tools (Chinese kitchen knife, WeBaCoo, Weevely) use
VPS8702 VPSC(源特科技)电源管理(PMIC) 封装SOT23-6
暴力破解全攻略
详解最强分布式锁工具:Redisson
MySQL八股文背诵版
【LeetCode】206. Reverse linked list
Nacos源码分析专题(二)-服务注册
递归检查配置项是否更变并替换
MySQL8 - use under Windows package installation method
PHP WebSehll 后门脚本与检测工具
有人知道HTML怎么到MYSQL数据库吗? (NODEJS)
Flask之路由(app.route)详解
Chapter 11_Database Design Specifications
OperatingSystemMXBean获取系统性能指标
很有意思的经历,很有意思的项目--文件夹对比工具
Week 304 Dunk
消息队列经典十连问
Nacos source code analysis topic (1) - environment preparation
内卷的正确打开方式