模糊搜索是我们常用的一个场景,在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.Wang原创文章,转载无需和我联系,但请注明来自lokie博客http://lokie.wang