如何加快在多列MySQL中的SELECT .. LIKE查询?

我有一个MySQL表,我非常频繁地使用SELECT x, y, z FROM table WHERE x LIKE '%text%' OR y LIKE '%text%' OR z LIKE '%text%'查询。 任何种类的索引是否有助于加快速度?

表中有几百万条logging。 如果有什么可以加速search的话,是否会严重影响数据库文件的磁盘使用率以及INSERTDELETE语句的速度? (没有UPDATE执行)

更新 :发布后很快,我看到了很多关于在查询中使用LIKE的方式的信息和讨论; 我想指出的是,解决scheme必须使用LIKE '%text%' (也就是说,我正在查找的文本是前缀并附加了%通配符)。 数据库也必须是本地的,原因很多,包括安全性。

索引不会加快查询速度,因为对于文本列索引是通过从左开始索引N个字符来工作的。 当你使用LIKE'%text%'时,它不能使用索引,因为在文本之前可能会有可变数量的字符。

你应该做的是不使用这样的查询。 相反,您应该使用MySQL支持的MyISAM表的FTS(全文search)。 为非MyISAM表创build这样的索引系统也非常容易,您只需要一个单独的索引表,您可以在实际表中存储单词和相关的ID。

索引不会帮助与前导通配符进行文本匹配,索引可用于:

 LIKE 'text%' 

但是我猜这不会削减它。 对于这种types的查询,如果要缩放可以search的logging数量,则应该查看全文search提供程序。 我的首选提供者是狮身人面像 ,非常全function/快速等Lucene可能也值得一看。 MyISAM表上的全文索引也是可行的,但是对于任何有大量写入的数据库来说,最终还是要追求MyISAM并不是一个好主意。

索引不能用于加快search条件以通配符开始的查询:

LIKE '%text%'

索引可以(也可以是,取决于select性)用于表单的search条件:

LIKE 'text%'

我会补充说,在某些情况下,如果你正在查看的字段通常是空的或者包含某些常量,那么你可以使用像/ rlike一样的索引来加速查询。

在这种情况下,似乎可以通过添加固定值的“and”子句来限制使用索引访问的行。

我试图在一个通常不包含很多标签的巨大表格中search“标签”。

SELECT * FROM objects WHERE tags RLIKE("((^|,)tag(,|$))" AND tags!=''

如果你有一个标签索引,你会看到它被用来限制被search的行。

也许你可以尝试将mysql5.1升级到mysql5.7。

我有大约7万条logging。 并运行以下SQL:

 select * from comics where name like '%test%'; 

mysql5.1中需要2000ms。 在MySQL5.7或MySQL5.6中需要200ms