2010-01-11 44 views
29

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

表中有几百万条记录。如果有什么会加快搜索速度,是否会严重影响数据库文件的磁盘使用率以及INSERTDELETE语句的速度? (无UPDATE被执行过)

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

+4

想想这样,它不是一个完美的比喻,但它表明了这一点。考虑在后面有一个词索引的书。如果你想查找一个简单的单词或者甚至是以相同的前几个字母开头的单词,那么没有问题。考虑当你想使用该书籍索引来查找包含单词中任何地方的字母“exe”的所有单词时会发生什么。这个索引几乎没有用,你可能会阅读真正的书来寻找这些词。这大致是你在mySQL上施加的问题。 – JohnFx

回答

51

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

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

+7

我应该补充说,自MySQL 5.6以来,全文搜索也可用于InnoDB。 – Sergio

+0

虽然有些情况下全文检索是不可能的,就像表意语言一样。 https://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html –

9

索引可以使用其中搜索标准与一个通配符开始加快查询速度:

LIKE '%text%'

索引可以(并且可能,这取决于选择性)用于搜索术语形式:

LIKE 'text%'

14

的索引将不会帮助文本匹配与一家领先的通配符,索引可以用于:

LIKE 'text%' 

但我猜测这不会削减它。对于这种类型的查询,如果要缩放可搜索的记录数量,您应该查看全文搜索提供程序。我的首选提供商是Sphinx,非常全功能/快速等。Lucene也许值得一看。 MyISAM表上的全文索引也可以工作,但最终追求MyISAM的任何数据库都有大量的写入操作并不是一个好主意。

+0

在MySQL 5.6及更高版本中,它们也可以与InnoDB表一起使用。 https://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html –

7

我想补充说的是,在某些情况下,如果您正在查看的字段通常为空或包含某些常量,则可以使用索引和/ rlike一起加快查询速度。

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

我尝试过在一张通常不包含很多标签的巨大表格中搜索“标签”。

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

如果您在标签上有一个索引,你会看到它是用于限制正在搜索的行。

+0

这是一个非常好的选择,我能够以这种方式对列进行索引。 – Kennysmoothx

6

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

我有大约70,000条记录。而下面的SQL运行:

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

这需要2000毫秒在mysql5.1。 在mysql5.7或mysql5.6中需要200ms