2011-03-09 104 views
0

MySQL的搜索優化我有一個關鍵字列表的陣列,獲得更好的性能

$arr = array('london','england','football',...);

該陣列可以有N個關鍵字。

我需要在sql查詢中使用這個,但我不想做太多這樣的重複。

select * from t1 where title LIKE('%$arr[0]%') OR title LIKE('%$arr[1]%') [...]

只需要一個更好的解決方案,因爲每個關鍵字過濾掉的記錄。

日Thnx

+0

查看MySQL的全文搜索(http://dev.mysql.com/doc/refman/5.5/en/fulltext-search。html) – 2011-03-09 12:14:10

回答

1

一個解決方案是創建一個填充了ROWID和keywordid每當創建或改變的行的查找表。

然後你可以跳過所有的LIKE並獲得更多的性能。

插入和更新的觸發器應該可以工作,但是插入和更新會花費更多的性能。

你只想用

SELECT * FROM t1 WHERE id in (SELECT id FROM lookup WHERE keywordid IN()) 

如果關鍵字有很多,你可以使用子查詢更獲得關鍵字的ID或者少使用一個緩存查找結構直接在代碼中,字典或類似。

0

我不確定是否要優化實際查詢本身或插入關鍵字查詢的方式。 如果是後者,那麼想到什麼迅速是:

$query = "SELECT * FROM t1 WHERE title"; 

foreach($arr as $keyword) 
{ 
    $stack[] = " LIKE '%$keyword%' "; 
} 

$query .= implode(' OR title ', $stack); 

如果你想避免基於關鍵字全表掃描,需要在自身與您的最終更多的解釋不同的主題。

+0

我更喜歡mysql查詢而不是php,因爲php循環很簡單:)只是希望它能在mysql上執行得更好:) – Val 2011-03-09 12:21:21

0

根據你要做的搜索的種類(和數量),你可能需要考慮使用別的而不是純粹的MySQL。

的MySQL本身倒不很適合當涉及到全文檢索:

  • 使用like '%...%'會導致不好的表演(掃描您的表的所有行)
  • 使用FULLTEXT索引意味着使用MyISAM作爲存儲引擎。


如果您需要做大量的搜索,它可能會變得更加有趣投資於一個專用於索引的解決方案/通過文字搜索,像SolrSphinx

+0

好吧,即時通訊嘗試查找數據庫,就像標籤雲一樣,您輸入的關鍵字越多,它越縮小搜索例如搜索汽車,製造,顏色和所有其他選項,如果這有意義的過濾系統 – Val 2011-03-09 12:23:11

相關問題