搜索多个MySQL表以获取大量术语的最有效方法是什么?

时间:2012-06-26 15:41:04

标签: php mysql full-text-search

使用可变长度的PHP数组(即它可能是50个术语,它可能是400个),对于每个术语搜索数据库的最有效方法是什么?

我正在尝试的搜索非常简单。对于每个学期,我都想这样做:

SELECT id, post_title FROM wp_posts WHERE post_title LIKE %term%

显然我可以在PHP中运行foreach并运行多个MySQL查询,但我认为这样效率非常低。

我最近尝试的代码涉及多个OR语句,但使用~100ish术语似乎运行速度非常慢。

我不知道这样的事情会起作用吗?

SELECT id, post_title FROM wp_posts WHERE post_title LIKE %term1%, %term2%, %term3%, %term4%, [...]

我可以使用更高效的SQL语句,还是应该以不同的方式看待它?

4 个答案:

答案 0 :(得分:2)

库存MySQL可以使用

处理这种搜索
MATCH (post_title) AGAINST ('term1 term2 term3 term4')

要执行此搜索,您需要使用

将全文索引添加到表中
ALTER TABLE wp_posts ADD FULLTEXT INDEX ft_key1(post_title);

这比LIKE%term%快,但请注意,全文索引仅在MyISAM表中受支持(InnoDB自MySQL 5.6以来支持此语法)。

然而,随着您的数据捆绑,MySQL搜索速度可能会成为一个问题。在这种情况下,我建议使用像Solr或Sphinx这样的外部搜索引擎。

如果您决定转换为Sphinx,可能需要查看本指南http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/

答案 1 :(得分:0)

创建一个包含单个列的附加索引,您只需在搜索期间连接要查询的所有表列的值。这样,您可以使用带有LIKE子句的单个SELECT查询一次搜索所有列。

这通常被称为“全文搜索”。

答案 2 :(得分:0)

使用MySQL最有效的方法是设置全文搜索... http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

答案 3 :(得分:0)

我不知道它是否比其他建议更有效但你也可以做到

SELECT id, post_title FROM wp_posts WHERE FIND_IN_SET(post_title, '%term1%, %term2%, %term3%, %term4%') <> 0