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%”
等查找的关键字,则不是?