针对慢查询的 SQL 匹配

标签 sql mysql

我有一个包含 2+ 百万(行)产品和 44 个字段(列)的表。 我正在尝试根据“NAME”字段(varchar 160)查询此表,我在该字段上有全文索引。

这是当前使用三个单词 $keyword 执行的查询,需要 71.34 秒, 两个单词 $keyword 需要 62.47 秒,单个单词 $keyword 需要 0.017 秒。

SELECT ID,
       MATCH(NAME) AGAINST ('$keyword') as Relevance,
       MANUFACTURER,
       ADVERTISERCATEGORY,
       THIRDPARTYCATEGORY,
       DESCRIPTION,
       AID,
       SALEPRICE,
       RETAILPRICE,
       PRICE,
       SKU,
       BUYURL,
       IMAGEURL,
       NAME,
       PROGRAMNAME
    FROM products 
   WHERE MATCH(NAME) AGAINST ('$keyword' IN BOOLEAN MODE) 
GROUP BY NAME
  HAVING Relevance > 6
ORDER BY Relevance DESC LIMIT 24

如何优化此查询,以便在 2 个以上单词的 $keyword 查询上获得更好的性能?

最佳答案

但是,这可能不是您正在寻找的答案:

对于这么大的表,全文搜索永远不会很快。我建议研究像 Sphinx 这样的全文引擎.

作为一个额外的好处,您还可以在 Sphinx 中进行相关性匹配,因为它将返回按相关性顺序排列的结果。一旦 Sphinx 返回匹配的 ID,您就可以在查询的 WHERE 子句中使用 IN 语句并选择您需要的其他数据。

我还建议研究 Sphinx 的扩展查询语法,因为这可以让您在邻近性和词序等方面匹配多个单词。

关于针对慢查询的 SQL 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4235268/

相关文章:

mysql - 查询为空时如何显示内容?

php - 如何根据某些条件重定向主页: PHP?

mysql - 在 IN() 运算符中使用 Mysql 存储函数的返回值

mysql - 列计数与第 1 行的值计数不匹配 VendorError :1136

php - MySQL 根据其他表值从表中选择

c# - 查询字符串 SQL 错误

SQL语句帮助——选择今天下单的客户

MySql 用列名连接两个表

sql - Crystal Reports 需要按派生日期范围分组

java - 我不明白为什么 Hibernate 创建一个带有两个连接的查询