当前位置:网站首页>【MySQL系列】- LIKE查询 以%开头一定会让索引失效吗
【MySQL系列】- LIKE查询 以%开头一定会让索引失效吗
2022-08-05 01:45:00 【索码理】
MySQL查询导致索引失效的情况有很多,通过搜索引擎搜索MySQL索引失效 几乎都会提到一个情况,那就是like查询以“%”开头。但是 LIKE查询 以%开头一定会让索引失效吗?
验证准备
- 创建一张users表,表结构如下,表中有999999条数据:
- 在name字段上创建索引
验证阶段
要验证一段SQL语句有没有使用到索引,最好的方法莫过于使用SQL执行计划EXPLAIN了。
- 首先先看一下LIKE查询不以%开头的情况:
EXPLAIN SELECT * FROM users WHERE `name` LIKE '001%';
type=range,key=idx_name,说明这段是使用了索引的。
- 接着再看一下LIKE查询不以%开头的情况
先看第一段SQL语句:
EXPLAIN SELECT * FROM users WHERE `name` LIKE '%001%'
type=ALL,所以这段SQL是没有使用索引的。
再来看第二段SQL语句:
EXPLAIN SELECT `name` FROM users WHERE `name` LIKE '%001%';
type=index,key=idx_name,这个结果说明这段SQL是使用了索引的。
接着看第三段SQL语句:
EXPLAIN SELECT id , `name` FROM users WHERE `name` LIKE '%001%';
第三段SQL语句是在第二段SQL语句的基础上多查询一列id。这个执行结果和第二段是一样的,说明这段也是使用了索引的。
最后看一下第四段SQL语句:
EXPLAIN SELECT id , `name` , gender FROM users WHERE `name` LIKE '%001%';
第四段SQL语句是在第三段SQL语句的基础上多查询两列id和gender。执行结果和第一段一样,是没有使用索引的。
验证结果
通过以上验证可以发现,LIKE查询 以%开头不一定会让索引失效。
为什么会走索引呢?
首先解释一下,执行计划中type=ALL和index。还有key的含义。
- type=ALL:全表扫描,遍历整张表去查询匹配的结果,不走索引。
- type=index:使用索引覆盖,仅仅扫描索引树,比ALL要快。
- type=range:使用索引进行范围查询时就会用到range访问方法。
- key:实际使用到的索引,如果为NULL就是没使用索引。
LIKE查询以%开头使用了索引的原因就是使用了索引覆盖。
针对二级索引MySQL提供了一个优化技术。即从辅助索引中就可以得到查询的记录,就不需要回表再根据聚集索引查询一次完整记录。使用索引覆盖的一个好处是辅助索引不包含整行记录的所有信息,故其大小要远小于聚集索引,因此可以减少大量的IO操作,但是前提是要查询的所有列必须都加了索引。
LIKE查询以%开头会导致全索引扫描或者全表扫描,如果没有索引覆盖的话,查询到的数据会回表,多了一次IO操作,当MySQL预估全表扫描或全索引扫描的时间比走索引花费的时间更少时,就不会走索引。有了索引覆盖就不需要回表了,减少了IO操作,花费的时间更少,所以就使用了索引。
总结
LIKE查询 以%开头不一定会让索引失效。如果查询的结果中只包含主键和索引字段则会使用索引,反之则不会。
边栏推荐
- MySQL学习
- pytorch的使用:使用神经网络进行气温预测
- [How to smash wool according to the music the couple listens to during the Qixi Festival] Does the background music affect the couple's choice of wine?
- 3. pcie.v file
- 工具类总结
- 居民用水问题
- 第十四天&postman
- 金仓数据库 KingbaseES V8 GIS数据迁移方案(3. 基于ArcGIS平台的数据迁移到KES)
- Log an error encountered when compiling google gn "I could not find a ".gn" file ..."
- Memory Forensics Series 1
猜你喜欢
[Redis] Redis installation under Linux
pytorch的使用:卷积神经网络模块
【Redis】Linux下Redis安装
PCIe Core Configuration
Leetcode brushing questions - 22. Bracket generation
【Word】Word公式导出PDF后出现井号括号#()错误
linux(centOs7)部署mysql(8.0.20)数据库
Memory Forensics Series 1
Why is this problem reported when installing oracle11
金九银十面试跳槽季;你准备好了吗?
随机推荐
测试工作这么难找吗?今年32,失业2个月,大龄测试工程师接下来该拿什么养家?
Residential water problems
Xunrui cms website cannot be displayed normally after relocation and server change
如何发现一个有价值的 GameFi?
GC高德坐标和百度坐标转换
Lattice PCIe Learning 1
【Redis】Linux下Redis安装
AI+小核酸药物|Eleven完成2200万美元种子轮融资
GCC:头文件和库文件的路径
安装oracle11的时候为什么会报这个问题
Leetcode刷题——22. 括号生成
汇编语言之源程序
动态规划/背包问题总结/小结——01背包、完全背包
记录谷歌gn编译时碰到的一个错误“I could not find a “.gn“ file ...”
深度学习:使用nanodet训练自己制作的数据集并测试模型,通俗易懂,适合小白
### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionExcep
Difference between MBps and Mbps
张驰咨询:揭晓六西格玛管理(6 Sigma)长盛不衰的秘密
[Word] #() error occurs after Word formula is exported to PDF
ORA-00257