MySQL的搜索優化我有一個關鍵字列表的陣列,獲得更好的性能
$arr = array('london','england','football',...);
該陣列可以有N個日關鍵字。
我需要在sql查詢中使用這個,但我不想做太多這樣的重複。
select * from t1 where title LIKE('%$arr[0]%') OR title LIKE('%$arr[1]%') [...]
只需要一個更好的解決方案,因爲每個關鍵字過濾掉的記錄。
日Thnx
MySQL的搜索優化我有一個關鍵字列表的陣列,獲得更好的性能
$arr = array('london','england','football',...);
該陣列可以有N個日關鍵字。
我需要在sql查詢中使用這個,但我不想做太多這樣的重複。
select * from t1 where title LIKE('%$arr[0]%') OR title LIKE('%$arr[1]%') [...]
只需要一個更好的解決方案,因爲每個關鍵字過濾掉的記錄。
日Thnx
一個解決方案是創建一個填充了ROWID和keywordid每當創建或改變的行的查找表。
然後你可以跳過所有的LIKE並獲得更多的性能。
插入和更新的觸發器應該可以工作,但是插入和更新會花費更多的性能。
你只想用
SELECT * FROM t1 WHERE id in (SELECT id FROM lookup WHERE keywordid IN())
如果關鍵字有很多,你可以使用子查詢更獲得關鍵字的ID或者少使用一個緩存查找結構直接在代碼中,字典或類似。
但是,這隻適用於標題完全是關鍵字,而不是如果標題包含關鍵字,因爲給定示例使用'LIKE'%nnn%''查找? – 2011-03-09 12:52:29
我不確定是否要優化實際查詢本身或插入關鍵字查詢的方式。 如果是後者,那麼想到什麼迅速是:
$query = "SELECT * FROM t1 WHERE title";
foreach($arr as $keyword)
{
$stack[] = " LIKE '%$keyword%' ";
}
$query .= implode(' OR title ', $stack);
如果你想避免基於關鍵字全表掃描,需要在自身與您的最終更多的解釋不同的主題。
我更喜歡mysql查詢而不是php,因爲php循環很簡單:)只是希望它能在mysql上執行得更好:) – Val 2011-03-09 12:21:21
查看MySQL的全文搜索(http://dev.mysql.com/doc/refman/5.5/en/fulltext-search。html) – 2011-03-09 12:14:10