MySQL搜索优化以获得更好的性能

时间:2011-03-09 12:10:01

标签: php mysql search

我有一个包含关键字列表的数组

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

该数组可以有N th 关键字。

我需要在sql查询中使用它,但我不想做这么多的重复。

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

只需要一个更好的解决方案,因为每个关键字都会过滤掉记录。

日Thnx

4 个答案:

答案 0 :(得分:1)

一种解决方案是创建一个查找表,每当创建或更改行时,该表都会使用rowid和keywordid填充。

然后你可以跳过所有的LIKE并获得更多的表现。

插入和更新的触发器应该可以工作,但插入和更新会花费更多的性能。

您只需使用

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

如果关键字很多,您可以使用更多的子查询来获取关键字ID,或者更少使用直接在代码,字典或同样中使用缓存查找结构。

答案 1 :(得分:1)

答案 2 :(得分:0)

我不确定您是想优化实际查询本身还是要在查询中插入关键字的方法。 如果是后者,那么很快就会想到的是:

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

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

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

如果您想避免基于关键字的全表扫描,那么本身需要一个不同的主题,并在最后提供更多解释。

答案 3 :(得分:0)

根据您将要进行的搜索的种类(和数量),您可能需要考虑使用除纯MySQL以外的其他内容。

在全文搜索方面,MySQL本身并不太适合:

  • 使用like '%...%'会导致效果不佳(扫描桌面的所有行)
  • 使用FULLTEXT索引意味着使用MyISAM作为存储引擎。


如果您需要进行大量搜索,那么投资专门用于索引/搜索文本的解决方案可能会变得更有趣,例如SolrSphinx