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

Php MySQL搜索优化以获得更好的性能,php,mysql,search,Php,Mysql,Search,我有一个包含关键字列表的数组 $arr=array('london','england','football',…) 数组可以有n个关键字 我需要在sql查询中使用它,但我不想像这样重复太多 从t1中选择*,其中标题类似(“%$arr[0]]”或标题类似(“%$arr[1]]”)[…] 只是需要一个更好的解决方案,因为每个关键字都会过滤掉记录 thnx一种解决方案是创建一个查找表,每当创建或更改一行时,该表将填充rowid和keywordid 然后,您可以跳过所有类似操作,获得更高的性能 ins

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

$arr=array('london','england','football',…)

数组可以有n个关键字

我需要在sql查询中使用它,但我不想像这样重复太多

从t1中选择*,其中标题类似(“%$arr[0]]”或标题类似(“%$arr[1]]”)[…]

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


thnx

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

然后,您可以跳过所有类似操作,获得更高的性能

insert和update上的触发器应该可以工作,但insert和update上的性能会稍高一些

你只需要

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本身不太适合全文搜索:

  • 使用“%”…%”之类的
    将导致性能不佳(扫描表中的所有行)
  • 使用
    全文
    索引意味着使用MyISAM作为存储引擎


如果您需要进行大量搜索,那么投资一个专门针对文本索引/搜索的解决方案可能会变得更有趣,比如,或。

看看MySQL的全文搜索()我更喜欢MySQL查询而不是php,因为php循环很简单:)只是想让它在mysql上表现得更好:)嗯,我正试图像标签云一样查找数据库。输入的关键字越多,搜索范围就越窄,例如搜索汽车、品牌、颜色和所有其他选项,如果这像过滤系统一样有意义,但这只有在标题正是关键字时才有效,如果标题包含给定示例使用“%nnn%”
查找的关键字,则不是?