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


What's the most efficient way to search multiple MySQL tables for a large quantity of terms?

采用长度可变的 PHP 术语数组(即可能是 50 个术语,也可能是 400 个术语),在我的数据库中搜索每个术语的最有效方法是什么?

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

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

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

我最近尝试的代码涉及多个OR语句,但对于 ~100 个术语,它似乎运行得很慢。

我不知道这样的事情是否有效?

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

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

Stock 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。

如果您决定切换到狮身人面像,您可能需要查看本指南 http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/

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

这通常称为"全文搜索"。

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

我不知道

它是否比其他建议更有效,但你也可以这样做

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