簡體   English   中英

MySQL搜索優化以獲得更好的性能

[英]MySQL Search optimisation for better performance

我有一個包含關鍵字列表的數組,

$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,或者更少使用直接在代碼,字典或類似中使用緩存查找結構。

我不確定您是想優化實際查詢本身還是要在查詢中插入關鍵字的方法。 如果是后者,那么很快就會想到的是:

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

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

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

如果您想避免基於關鍵字的全表掃描,那么本身需要一個不同的主題,並在您的最后提供更多解釋。

根據您將要進行的搜索的種類(和數量) ,您可能需要考慮使用除了純MySQL之外的其他內容。

在全文搜索方面,MySQL本身並不是很適合:

  • 使用like '%...%'會導致糟糕的表現(掃描你桌子的所有線條)
  • 使用FULLTEXT索引意味着使用MyISAM作為存儲引擎。


如果您需要進行大量搜索,那么投資專用於索引/搜索文本的解決方案(如SolrSphinx)可能會變得更有趣。

暫無
暫無

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

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