繁体   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