前言
众所周知,在索引时,如果模糊查询的%置于最前面,索引会失效。
但之前面试时,面试官问了我一个问题:%前置的情况,什么情况下会使用到索引?
借此博客,说明下。
正文
解决方式一
反转模糊查询的字段,但是注意,对于"%keywork%"的索引,此方法是无效的。
如
select * from student where name like '%三';
我们可以改造为:
select * from student where reverse(name) like reverse('%三');
使用了索引,此方法能有效降低io次数。
解决方式二
其实此方法不能叫做解决方法,大概是之前面试官问我的问题的标准答案吧,即“在%前置的情况下,什么情况下会使用到索引”;
此测试源自博客https://blog.csdn.net/zy_281870667/article/details/86595148
首先我们有TEST_USER
表:
CREATE TABLE `TEST_USER` (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`NAME` varchar(64) DEFAULT NULL COMMENT '名字',
`MOBILE` varchar(11) DEFAULT NULL COMMENT '手机号',
PRIMARY KEY (`ID`),
KEY `INDEX_MOBILE` (`MOBILE`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试的用户表';
我们给MOBILE
字段创建索引,同时表拥有者ID
这个主键索引。
-
测试一:
只查手机号
从上面图片中的执行计划可以看出,查询是走了索引的 -
测试二:
查手机号和主键
从执行计划中看,也是走了索引的 -
测试三:
select 索引字段和非索引字段
从执行计划,可以看出这次是没有走索引的了 -
测试四:
假如where后面,多个条件
也是走了索引的
结论
可以得到一个结论:like查询百分号前置,并不是100%不会走索引。如果只select索引字段,或者select索引字段和主键,也会走索引的。
总结
其实mysql索引看似规则很简单,但是其实想搞懂还是千难万难的,比如索引内存结构、索引叶子结构等,都需要我们去花时间理解,懂得了“是什么、为什么”这样才能更好地帮助我们“怎么用”。