如何加快在多列MySQL中的SELECT .. LIKE查询?
我有一个MySQL表,我非常频繁地使用SELECT x, y, z FROM table WHERE x LIKE '%text%' OR y LIKE '%text%' OR z LIKE '%text%'
查询。 任何种类的索引是否有助于加快速度?
表中有几百万条logging。 如果有什么可以加速search的话,是否会严重影响数据库文件的磁盘使用率以及INSERT
和DELETE
语句的速度? (没有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 。