我正在構建一個論壇,並且正在尋找合適的方法來構建一個搜索功能,通過他們的姓名或職位名稱來查找用戶。我得到的是這樣的:MySQL:使用LIKE或FULLTEXT優化搜索
SELECT users.id, users.user_name, users.user_picture
FROM users, subject1, subject2
WHERE users.id = subject1.user_id
AND users.id = subject2.user_id
AND (users.user_name LIKE '%{$keywords}%'
OR subject1.title1 LIKE '%{$keywords}%'
OR subject2.title2 LIKE '%{$keywords}%')
ORDER BY users.user_name ASC
LIMIT 10
OFFSET {$offset}
LIMIT和OFFSET是分頁。我的問題是,當行數達到相當數量時,是否會通過多個表進行LIKE搜索,從而大大降低性能?
我有幾個備選方案: 一個,也許我可以重寫該查詢,使LIKE搜索在只返回索引user_ids的子查詢中完成。然後,我會根據該信息找到其餘的用戶信息。這會提高性能嗎?
第二,我想我可以在LIKE {$keyword}%
的第一個通配符之前出現$keyword
字符串。這樣,我可以索引user_name, title1, and title2
列。但是,因爲我會在這裏交易速度的準確性,所以這會帶來多大的性能差異?爲索引這些列而犧牲這麼高的精度是否值得?
三,也許我可以給用戶3個搜索字段選擇,並且每個搜索只能通過一個表。這會提高性能嗎?
最後,我應該考慮使用FULLTEXT搜索而不是LIKE?兩者之間的性能差異是什麼?另外,我的表使用的是InnoDB存儲引擎,除非切換到MyISAM,否則我無法使用FULLTEXT索引。切換到MyISAM會有什麼重大區別嗎?
分頁是我擔心的另一個性能問題,因爲爲了執行分頁,我需要查找查詢返回的結果總數。目前,我基本上只是在做TWICE的查詢,因爲第一次使用時只用於COUNT
的結果。
我期待有大量的寫入到我的表中,但不超過SELECT的數量。你會不會推薦我在這種情況下切換到MyISAM全文索引? – recount88 2011-08-17 13:25:33