[英]optimize tables for search using LIKE clause in MySQL
我正在為我的站點的消息部分構建一個搜索功能,並且有一個包含 9,000,000 多行的消息數據庫,以及對sender
、 subject
和message
字段的索引。 我希望在我的查詢中使用 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 的全文搜索不是很好,但它是功能性的。
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.