使用MySQL中的LIKE子句优化表搜索

时间:2012-04-14 10:12:32

标签: php mysql indexing

我正在为我的网站的消息部分构建一个搜索功能,并且拥有一个包含9,000,000多个行的消息数据库,并在sendersubject和{{1字段。我希望在我的查询中使用LIKE mysql子句,例如(ex)

SELECT messagesendersubject FROM message WHERE Messages LIKE'%EXAMPLE_QUERY%';

检索结果。遗憾的是,当存在前导通配符时,MySQL不使用索引,这对于搜索查询可能出现在消息中的任何位置(这是通配符的工作原理,不是吗?)。查询非常非常慢,我也不能使用全文索引,因为烦人的50%规则(我根本无法排除这么多)。无论如何(或者甚至是任何替代方案)使用like和两个通配符来优化查询?任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:3)

您应该使用全文索引(您说不能),自己设计全文搜索或从MySQL卸载搜索并使用Sphinx / Lucene。对于Lucene,您可以使用Zend Framework中的Zend_Search_Lucene实现或使用Solr。

MySQL中的普通索引是B + Trees,如果不知道字符串的开头就不能使用它们(当你在开头有通配符时就是这种情况)

另一种选择是使用参考表自己实现搜索。在单词中拆分文本并创建包含word,record_id的表。然后在搜索中,您将用单词拆分查询并搜索参考表中的每个单词。这样你就不会把自己限制在整个文本的开头,而只是限制在给定单词的开头(并且你会与其他单词匹配)

答案 1 :(得分:0)

'%EXAMPLE_QUERY%';是一个非常糟糕的主意..我会给你一些

一个。在LIKE查询开始时使用'EXAMPLE_QUERY%';代替

避免使用通配符

B中。创建可以轻松使用MATCH

的关键字

答案 2 :(得分:0)

如果你想坚持使用MySQL,你应该使用FULL TEXT索引。全文索引文本块中的索引词。然后,您可以搜索词干并按相关性顺序返回结果。所以你可以在一个文本块中找到“example”这个词,但你仍然无法在“xampl”上有效搜索以找到“example”。

MySQL的全文搜索功能不是很好,但功能齐全。

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

答案 3 :(得分:-3)

select * from emp where ename like '%e';

给出以字母e结尾的emp_name。

select * from emp where ename like 'A%';

给出以字母a开头的emp_name。

select * from emp where ename like '_a%';

给出emp_name,其中第二个字母是。