mysql - 优化 innoDB 中的 MySQL LIKE '%string%' 查询

标签 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;

我们想优化以下查询:

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/

相关文章:

arrays - Swift 数组不返回所有值

mysql - 需要索引来加速 MySQL 查询

javascript - 在 Javascript 对象中使用 'this'

php - 按天从mysql数据库中获取查询

Mysql 查询 - 在连接表中搜索而不过滤记录

mySQL 上的 mysql.user 表

mysql - 每 30 分钟分组时间戳

sql - 使用多个 IN 语句但没有笛卡尔积的查询

php - 通过 Unix 套接字的 MySQL 连接适用于 mysqli,但不适用于 PDO

C#/SQLCE CREATE TABLE programmatically(自增+主键)