像';%一样优化MySQL字符串%';innoDB中的查询

像';%一样优化MySQL字符串%';innoDB中的查询,mysql,sql,indexing,query-optimization,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(所以现在没有全文),为了优化这样的查

拥有这张桌子:

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`);
但是解释查询显示需要扫描整个表 如果我们的查询像“whatever%”,那么这个索引执行得很好,但在其他方面没有任何价值

是否有针对innoDB的优化方法


谢谢

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

但是切换到像“%whatever%”这样的
会删除字符串开头的锚点。现在无法使用基于开始的索引,因为您的搜索项不再锚定在字符串的起始处——它在中间某个地方“浮动”,整个字段必须进行搜索。任何像“%”这样的
查询都不能使用索引

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


值得注意的是:InnoDB从5.6.4版开始索引。因此,除非您无法升级到至少5.6.4,否则没有什么能阻止您使用InnoDB*和全文搜索。

我想说一句,令人惊讶的是,在我的例子中,创建索引也有助于加快对
的查询,如“%abc%”
查询

Ubuntu
上运行
MySQL 5.5.50
(保留默认设置),我创建了一个包含大量列的表,并插入了
100000
伪条目。在一列中,我插入了32个字符的完全随机字符串(即它们都是唯一的)。

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

select id, searchcolumn from table_x where searchcolumn like '%ABC%'
在不使用索引的情况下,在
~2秒
内返回结果,在使用索引的情况下,在
0.05秒
内返回结果

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

编辑
我已经检查了解释输出。输出显示行数为
100000
,但额外信息为“
使用where;使用索引”。因此,DBMS必须搜索所有行,但仍然能够使用索引?

谢谢,我在云环境中使用MySQL 5.0.77-log,因此无法升级:(如果我们移动到NYNDB,我们是否需要更改查询以使用匹配/反)?或者当前使用“全文索引”的“类”好处吗?谢谢,不,FullTeXT需要匹配/反对的东西。和pg_trgm。为什么mysql不能从中获得一些灵感呢?我也推荐一些mysql性能调整,或者您的查询不包含LIKE条件。这就是为什么要使用索引。@ditscheri抱歉,这是一个拼写错误,实际上是一个LIKE条件(刚刚更正了我的帖子)对于基准测试,您需要在两个查询之间重新启动mysql。根据列数、可用RAM、order by、limit等,性能可能会有所提高,因为引擎能够执行完全索引扫描。这不如索引查找效率高,但可能比完全表扫描效率更高.