2011-03-09 82 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

相关问题