模糊查询%在最前面,能否或者怎么使用索引

前言

众所周知,在索引时,如果模糊查询的%置于最前面,索引会失效。

但之前面试时,面试官问了我一个问题:%前置的情况,什么情况下会使用到索引?

借此博客,说明下。

正文

解决方式一

反转模糊查询的字段,但是注意,对于"%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索引看似规则很简单,但是其实想搞懂还是千难万难的,比如索引内存结构、索引叶子结构等,都需要我们去花时间理解,懂得了“是什么、为什么”这样才能更好地帮助我们“怎么用”。

发布了63 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Hpsyche/article/details/102313151