MySQL搜索查询优化:匹配...反对vs%LIKE%

时间:2013-10-20 11:20:27

标签: mysql sql

我想建立我的第一个真正的搜索功能。我一直在谷歌上搜索,但是我无法真正理解并理解一切。

我的数据库存在三个InnoDB表:

  • 产品:包含产品信息。列:proID(主要,自动增量),content(最多包含几百个字),titleauthoryear和一堆与搜索查询无关的其他人。行数:100到2000。
  • 类别:包含类别信息:列:catID(主要,自动增量),catName。行:5-30
  • 产品类别:上述两者之间的联系。每个产品都可以与多个类别相关联。列:pcID(主要,自动增量),catIDproID。行数:产品量的1-5倍。

我的搜索功能提供以下功能。它们不必填写。如果填写了多个,最终查询将使用AND查询将它们连接起来:

  • 条款:搜索内容和标题字段。搜索随机术语,可以添加多个单词,但是每个单词的搜索都是分开的。最有可能与数据库匹配的内容应该足以达到命中(OR - 查询)
  • 年份:搜索产品的年份列。
  • 类别:可从类别列表中选择。多种可能。表单返回所选类别的catID。 1与数据库的匹配应足以进行命中(OR-query)
  • 作者:搜索author - 产品列

您可能已经注意到,当选择某个类别时,表格产品和产品类别会连接在一起以进行搜索查询。两者之间还有一个外键。

清除关系是一个如何解释它的例子(没有搜索年份!):

搜索WHERE (products.content = term 1 OR products.content = term 2 OR products.title = term 1 OR products.title = term 2 ......) AND (products.author = author) AND (productscategories.catID = catID1 OR productscategories.catID= catID2 ......)

另请注意,我创建了一个分页系统,每个“页面”只显示10个结果。

我遇到的问题如下:我希望优化此搜索查询,但无法确定哪种方式最佳。

我发现Googling的大多数情况都使用了LIKE %% mysqli查询。但有些人使用了MATCH...AGAINST。我似乎非常喜欢最后一个,因为我读到它可以排序相关性,因为它似乎使查询更容易创建(1匹配术语值而不是大量的LIKE %%OR相结合。看来我只会在Term-searchfield上使用它。但是对于MATCH...AGAINST,我需要一个MyIsam表(对吗?),我不能使用外键来防止数据库出现故障。

MATCH...AGAINST示例(没有年份字段,类别字段且未加入产品和产品类别):

SELECT *,MATCH (content,title) AGAINST ('search terms' IN BOOLEAN MODE) AS relevance 
FROM products WHERE (MATCH (content,title) AGAINST ('search terms' IN BOOLEAN MODE)) AND
author='author' SORT BY relevance LIMIT 10

%LIKE%示例(没有年份字段,类别字段,没有加入产品和产品类别),遗憾的是没有相关性排序:

SELECT * FROM products WHERE
(content LIKE '%term1%' OR content LIKE '%term2' OR title LIKE '%term1%' OR title LIKE '%term2%')
AND (author='author') SORT BY title LIMIT 10

我可以使用CASE进行相关性排序,如果标题或内容中包含一个词,则可以添加“点数”吗?或者这会使查询对性能过重?

那么进行此类查询的最佳方法是什么?使用Innodb和LIKE,或切换到MyIsam并使用MATCH...AGAINST进行排序?

1 个答案:

答案 0 :(得分:4)

你不必切换到MyIsam。 Mysql 5.6及更高版本支持全文索引。

我通常建议使用全文索引。在列标题,作者,年份

上创建全文索引

然后,您可以同时对所有3个运行全文查询,并应用IN BOOLEAN MODE来真正缩小搜索范围。这是你必须自己决定的事情,但全文中的选项更多。

但是,如果您正在运行在范围,日期或简单字符串之间生成的查询。然后标准索引更好,但是对于不同列中的tekst搜索,全文索引是可行的方法!

阅读本文:http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html