模糊查询能否或者怎么使用索引


前言

众所周知,在索引时,如果模糊查询的%置于最前面,索引会失效。但是在%前置时,什么情况下会使用到索引?

补充

  • like %keyword 索引失效,使用全表扫描。但可以通过翻转函数+like前模糊查询+建立翻转函数索引=走翻转函数索引,不走全表扫描。

  • like keyword% 索引有效。

  • like %keyword% 索引失效,也无法使用反向索引。

解决

方式一

反转模糊查询的字段,但是注意,对于%keywork%的索引,此方法是无效的。

select * from company where companyName like '%江南皮革长';

我们可以改造为:

select * from company where reverse(companyName) like reverse('%江南皮革长');

方式二

首先我们有TEST_USER表:

CREATE TABLE `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='测试的用户表';

只查询索引

EXPLAIN SELECT
    MOBILE
FROM
    USER
WHERE
    MOBILELIKE '%151'


Extra:Using index. (走索引)

查索引字段和主键

EXPLAIN SELECT
    ID,MOBILE
FROM
    USER
WHERE
    MOBILE LIKE '%151'

Extra:Using index. (走索引)

查非索引字段

EXPLAIN SELECT
    MOBILE,NAME
FROM
    USER
WHERE
    MOBILE LIKE '%151'


Extra:Using where. (不走索引)

where后面多条件

where后跟普通条件
EXPLAIN SELECT
    MOBILE
FROM
    USER
WHERE
    NAME = '江南皮革厂'
AND MOBILE LIKE '%151'


Extra:Using where. (不走索引)

where后跟主键
EXPLAIN SELECT
    MOBILE
FROM
    USER
WHERE
    ID >1
AND MOBILE LIKE '%151'


Extra:Using index. (走索引)

总结

like查询百分号前置,并不是100%不会走索引。
如果只select索引字段,或者select索引字段和主键,也会走索引的。
如果where条件中有主键时,走索引。

一句话:在select和where中存在除了索引和主键外的其他条件或字段时,不走索引。


文章作者: 少年闰土
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 少年闰土 !
评论
 上一篇
自定义博客添加Rss订阅 自定义博客添加Rss订阅
RSS订阅是站点用来和其他站点之间共享内容的一种简易方式,即Really Simple Syndication(简易信息聚合),如果不会使用,可以参见百度百科:https://baike.baidu.com/item/RSS%E8%AE%A
2020-06-06
下一篇 
在Hexo博客中加入豆瓣读书页面 在Hexo博客中加入豆瓣读书页面
在Hexo博客个性化定制中,加入豆瓣读书界面是一个很不错的功能,可以进入我的个人阅读界面查看效果,那么我是怎么做到的呢?其实很简单,我们只需要加入一个hexo-douban模块即可。 安装模块依赖我们使用时可以先安装依赖模块,在GitBa
2020-05-17
  目录