有这张表:
CREATE TABLE `example` (
`id` int(11) unsigned NOT NULL auto_increment,
`keywords` varchar(200) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
我们想优化以下查询:
SELECT id FROM example WHERE keywords LIKE '%whatever%'
该表是 InnoDB,(所以现在没有全文)哪个索引是优化此类查询的最佳索引?
我们尝试了一个简单的:
ALTER TABLE `example` ADD INDEX `idxSearch` (`keywords`);
但是解释查询显示需要扫描整个表 如果我们的查询改为 LIKE 'whatever%',则该索引表现良好,但否则没有任何值(value)。
有没有办法针对 innoDB 进行优化?
谢谢!
最佳答案
索引是从字符串的开头到结尾构建的。当您使用LIKE 'whatever%'
类型子句时,MySQL可以使用这些基于start的索引非常快速地查找whatever
。
但是切换到 LIKE '%whatever%'
会删除字符串开头的 anchor 。现在无法使用基于开始的索引,因为您的搜索词不再锚定在字符串的开头 - 它“ float ”在中间的某个位置,并且必须搜索整个字段。任何 LIKE '%...
查询都不能使用索引。
如果您所做的只是“ float ”搜索,这就是您使用全文索引的原因,因为它们是为这种类型的使用而设计的。
值得注意的是:InnoDB 现在 supports fulltext自版本 5.6.4 起的索引。因此,除非您无法升级到至少 5.6.4,否则没有什么可以阻止您使用 InnoDB *和全文搜索。
关于mysql - 优化 innoDB 中的 MySQL LIKE '%string%' 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41291023/