26

有这张表:

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,(所以现在没有 FULLTEXT)哪个是用于优化此类查询的最佳索引?

我们尝试了一个简单的:

ALTER TABLE `example` ADD INDEX `idxSearch` (`keywords`);

但是一个解释查询表明,如果我们的查询是 LIKE 'whatever%',则需要扫描整个表 ,该索引执行良好,否则没有任何价值。

反正有没有为 innoDB 优化这个?

谢谢!

4

2 回答 2

53

索引是从字符串的开头到结尾构建的。当你使用LIKE 'whatever%'type 子句时,MySQL 可以使用那些基于 start 的索引来whatever非常快速地查找。

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

如果您所做的只是“浮动”搜索,这就是您使用全文索引的原因,因为它们是为这种类型的使用而设计的。

主要注意事项:InnoDB 现在支持从 5.6.4 版本开始的全文索引。因此,除非您不能升级到至少 5.6.4,否则没有什么可以阻止您使用 InnoDB * AND全文搜索。

于 2012-04-27T16:19:47.827 回答
1

我想评论一下,like '%abc%'在我的案例中,创建索引也有助于加快查询速度。

继续运行(将所有MySQL 5.5.50内容Ubuntu保留为默认值),我创建了一个包含很多列并插入了100,000虚拟条目的表。在一列中,我插入了完全随机的 32 个字符的字符串(即它们都是唯一的)。

我运行了一些查询,然后在该列上添加了一个索引。一个简单的

select id, searchcolumn from table_x where searchcolumn like '%ABC%'

~2 seconds 在没有索引和0.05 seconds 索引的情况下返回结果。

这不符合上面的解释(以及许多其他帖子)。这可能是什么原因?

编辑 我检查了解释输出。输出显示 rows 是100,000,但 Extra info 是 " Using where; Using index"。所以不知何故,DBMS 必须搜索所有行,但仍然能够利用索引?

于 2017-01-18T10:18:54.463 回答