关于MySQL 5.7下 like 索引的探究

模糊搜索是我们常用的一个场景,在Mysql中一般都是用Like实现,对于MySQL的索引一直认为是最左索引,所有Like ’%%‘是不命中索引的,’%dsafasdf‘是不命中的。而Like ’dsafas%‘ 是命中的这个观念一直停留在我的脑海中,但是5.7甚至是8.0的还是不是这样呢,有人说不是,mysql已经修复了这个问题。今天特意尝试一下。

首先在Mysql 5.7.19版本是做的实验,表结构很简单如下:

CREATE TABLE `Test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(200) DEFAULT NULL,
  `ReserveName` varchar(200) DEFAULT NULL,
  `CreateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_Name` (`Name`),
  KEY `idx_reserve` (`ReserveName`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

建立了索引在Name字段上。

新建两条数据:


INSERT INTO `Test` (`id`, `Name`, `ReserveName`, `CreateTime`)
VALUES
    (1, '上海魅客信息科技有限公司', '司公限有技科息信客魅海上', '2020-03-24 10:57:29'),
    (2, '江苏苏衡招标投标公共服务平台有限公司', '司公限有台平务服共公标投标招衡苏苏江', '2020-03-24 11:06:25');
    

然后执行如下SQL:

select * from Test where Name like '%有限%'

应该能返回两条数据。

好我们来看下到底命中不命中索引:

    
    explain select * from Test where Name like '%有限%'

可以看到:

id    select_type    table    partitions    type    possible_keys    key    key_len    ref    rows    filtered    Extra
1    SIMPLE    Test    NULL    index    NULL    PRIMARY    4    NULL    2    50.00    Using where

也就是不走索引的。但是深度探究下如果不select * 呢会怎么样?

explain select Name from Test where Name like '%有限%'

返回如下:

id    select_type    table    partitions    type    possible_keys    key    key_len    ref    rows    filtered    Extra
1    SIMPLE    Test    NULL    index    NULL    idx_Name    803    NULL    2    50.00    Using where; Using index

很明显直接走了索引而且没有回表
所以可以这样做。

select * from Test where Name in(
   select Name from Test where Name like '%有限%'
)

explain后的结果:

    1    SIMPLE    Test    NULL    index    idx_Name    idx_Name    803    NULL    2    50.00    Using where; Using index; LooseScan
1    SIMPLE    Test    NULL    ref    idx_Name    idx_Name    803    TestDB.Test.Name    1    100.00    NULL

当然如果数据较少没有必要这样做。

Lokie博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • 本博客使用免费开源的 laravel-bjyblog v5.5.1.1 搭建 © 2014-2018 lokie.wang 版权所有 ICP证:沪ICP备18016993号
  • 联系邮箱:kitche1985@hotmail.com