在innoDB中优化MySQL LIKE'%string%'查询

jms*_*rra 18 mysql sql indexing query-optimization

有这个表:

CREATE TABLE `example` (
`id` int(11) unsigned NOT NULL auto_increment,
`keywords` varchar(200) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

我们想优化以下查询:

SELECT id FROM example WHERE keywords LIKE '%whatever%'
Run Code Online (Sandbox Code Playgroud)

该表是InnoDB,(现在没有FULLTEXT),这将是用于优化此类查询的最佳索引?

我们尝试过一个简单的方法:

ALTER TABLE `example` ADD INDEX `idxSearch` (`keywords`);
Run Code Online (Sandbox Code Playgroud)

但是一个解释查询显示需要扫描整个表, 如果我们的查询LIKE'无论%'代替,这个索引表现良好,但在其他方面没有价值.

无论如何要为innoDB优化这个吗?

谢谢!

Mar*_*c B 45

索引是从字符串的开头到结尾构建的.当您使用LIKE 'whatever%'type子句时,MySQL可以使用这些基于开始的索引来whatever快速查找.

但是切换到LIKE '%whatever%'在字符串开头删除该锚点.现在不能使用基于开始的索引,因为您的搜索词不再锚定在字符串的开头 - 它在中间某处"浮动",整个字段必须是搜索.任何LIKE '%...查询都不能使用索引.

这就是为什么你使用全文索引,如果你所做的只是"浮动"搜索,因为它们是为这种用法而设计的.

主要说明:InnoDB现在支持版本5.6.4的全文索引.因此,除非你不能升级到至少5.6.4,否则没有什么能阻止你使用InnoDB*全文搜索.