簡體   English   中英

使用WHERE之類的慢MySQL查詢

[英]Slow MySQL query using WHERE like

這是我用來執行論壇搜索的查詢。

$sql = "SELECT t.title, t.user_id, t.replies, t.views, t.last_poster_name, t.last_post_time, a.username
FROM fm_topics t 
LEFT JOIN fm_replies r 
ON t.t_id=r.topic_id 
LEFT JOIN account a 
ON t.user_id=a.id
WHERE 
`title` LIKE '%" . sanitize($search_string) . "%' OR
`content` LIKE '%" . sanitize($search_string) . "%'
GROUP BY t_id LIMIT 0, 10";

以上工作正常。 但是,加載大約需要5秒鍾以上的時間。 現在,如果我也從中刪除搜索標題的部分,則加載速度會更快(顯然)。 我的問題是,如何改善此查詢? 您將如何重寫它以獲得更好的性能?

您可以使用MySql函數,例如MATCHAGAINST 默認情況下, MATCH()函數針對文本集合對字符串執行自然語言搜索。 集合是FULLTEXT索引中包含的一組一個或多個列。 搜索字符串作為AGAINST()的參數給出。 對於表中的每一行, MATCH()返回一個相關性值; 也就是說,在搜索字符串和MATCH()列表中命名的列中該行中的文本之間的相似性度量。

自然語言全文搜索

查詢不需要優化,而是如果未對該表進行索引,則該表可能不需要優化。

什么是SQL Server中的索引?

對於您的方案,即使用通配符的文本搜索,建議使用Full text indexing

什么時候應該使用全文索引?

為什么不進行全文搜索和索引呢? 這樣可以使搜索更快。 通過使用LIKE查詢,尤其是使用前綴通配符的查詢,意味着必須按順序掃描每一行。

https://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

我將在title,content上創建兩列全文索引:

CREATE FULLTEXT INDEX index_content ON (title,content)

比像這樣搜索:

SELECT ... WHERE MATCH(title, content) AGAINST ("your query")

(可選)使用IN BOOLEAN MODE閱讀文檔,了解為何會使用和不會使用此修飾符的原因。

如果你真的無法實現全文搜索+指數和需要保持LIKE那么你可以考慮只是添加普通索引content ,但隨后利用該索引,你將不得不刪除前導通配符(你可以保持尾隨一個); MySQL不能在前導通配符查詢上使用索引。

暫無
暫無

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

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