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