簡體   English   中英

在 MySQL 中使用 LIKE 子句優化搜索表

[英]optimize tables for search using LIKE clause in MySQL

我正在為我的站點的消息部分構建一個搜索功能,並且有一個包含 9,000,000 多行的消息數據庫,以及對sendersubjectmessage字段的索引。 我希望在我的查詢中使用 LIKE mysql 子句,例如 (ex)

SELECT sender , subject , message FROM Messages WHERE message LIKE '%EXAMPLE_QUERY%';

檢索結果。 不幸的是,當存在前導通配符時,MySQL 不使用索引,這對於搜索查詢可能出現在消息中的任何位置是必要的(這就是通配符的工作方式,不是嗎?)。 查詢速度非常慢,我也不能使用全文索引,因為煩人的 50% 規則(我不能排除那么多)。 有沒有(或者甚至有任何替代方法)可以使用 like 和兩個通配符來優化查詢? 任何幫助表示贊賞。

您應該使用全文索引(您說過不能),自己設計全文搜索,或者從 MySQL 卸載搜索並使用 Sphinx/Lucene。 對於 Lucene,您可以使用 Zend Framework 中的 Zend_Search_Lucene 實現或使用 Solr。

MySQL中正常的索引是B+Trees,如果不知道字符串的開頭是不能使用的(而且開頭有通配符就是這種情況)

另一種選擇是使用參考表自行實施搜索。 將文本拆分為單詞並創建包含單詞 record_id 的表。 然后在搜索中將查詢拆分為單詞並搜索參考表中的每個單詞。 通過這種方式,您不會將自己限制在整個文本的開頭,而是僅限於給定單詞的開頭(無論如何您都會匹配其余的單詞)

'%EXAMPLE_QUERY%'; 是一個非常非常糟糕的主意……我會給你一些

A. 避免在 LIKE 查詢開始時使用通配符 use 'EXAMPLE_QUERY%'; 反而

B. 創建可以輕松使用MATCH關鍵字

如果你想堅持使用 MySQL,你應該使用 FULL TEXT 索引。 全文索引文本塊中的索引詞。 然后,您可以搜索詞干並按相關性順序返回結果。 因此,您可以在文本塊中找到單詞“example”,但仍然無法在“xampl”上高效搜索以找到“example”。

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

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

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 其中第二個字母是 a。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM