2015-05-31 40 views
0

我有一個使用MySQL編寫的PHP論壇,我想提供論壇搜索。它將允許用戶搜索特定的字符串,以及過濾元數據,如發佈日期和主題等。元數據可以被有效地搜索,因爲大多數這些字段都被編入索引,但我認爲主要的用例當然是普通的文本搜索,並且不使用可以修剪結果的元數據過濾器。高效的MySQL文本搜索

經過一些測試後,我發現與大多數人的設置相反,SQL_CALC_FOUND_ROWS比查詢兩次顯着更快(約1.5倍),以便獲得結果數量,所以我最好的查詢是:

SQL_CALC_FOUND_ROWS * from blahblah where content like '%term%' limit whatever whatever; 

不出所料,這非常慢,因爲它必須與數據庫中的每個論壇帖子進行文本匹配。有什麼我可以做的改進呢?在使用LIKE運算符時,是否會在內容(TEXT)字段中添加索引?通常如何做到這一點?

+0

你看過全文搜索嗎? https://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html#function_match – chris85

回答

4

在列的索引會有所幫助,即便是使用像運營商,而不是當你在一開始有一個通配符了。因此,對於term%索引將是有益的,但對於%term%它不會。

而是你可以看看FULLTEXT指標。如果您將這樣的索引添加到TEXT字段,MySQL會索引單獨的單詞並允許您執行各種類似搜索引擎的搜索。要搜索,請使用MATCH() ... AGAINST而不是LIKE

請參閱該文檔: https://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

免責聲明:我建議你第一個實驗後仔細閱讀文檔。 FULLTEXT索引是強大的,但仍然有其限制。

FULLTEXT索引會佔用相當長的一段空間,他們建立起來的方式取決於MySQL的核心設置,所以他們可以表現不同的本地設置和服務器之間。

例如,它們指數完整的單詞,但留下了很短的話和某些停止的話。而且,因爲他們編入了詞彙,你將無法搜索詞的部分。尋找「術語」不會在框中找到「確定」。

所以一定要確保這些指標可以做你想做的,如果你有一個共享的主機,確保它們可以被配置和調整你做一個大的實現之前,你喜歡的方式。

+0

啊,謝謝,我還沒有見過這個:)我只是想出必須有東西比'更喜歡' %長期%''。 – Mala