0

我一直在使用以下查询一段时间,但随着结果数据库的增长,它变得缓慢到无法使用的程度。任何人都可以提出另一种方法吗?

我在 c.name 和 r.scope 上有全文索引

SELECT * FROM results r 
        INNER JOIN categories c on r.id = c.result_id 
        INNER JOIN tags t on r.id = t.result_id 
        WHERE c.name in ('purchase', 'single_family', 'other')

        AND ( r.scope = 'all' OR r.scope = 'hi' )
        AND published = 1
    GROUP BY r.id
        HAVING COUNT(c.c_id) >= 3
        ORDER BY r.usefulness DESC
        LIMIT 8 OFFSET 0

任何帮助将非常感激。谢谢!

编辑:这是解释的结果

  id    select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  c   range   nameindex,name  nameindex   767     NULL    10036   Using where; Using temporary; Using filesort
1   SIMPLE  t   ALL     NULL    NULL    NULL    NULL    10229   Using where; Using join buffer
1   SIMPLE  r   eq_ref  PRIMARY,scope   PRIMARY     4   rfw.t.result_id     1   Using where
4

4 回答 4

1

更新:查询创建索引

CREATE INDEX name ON categories (name);


使用 Explain 语句,explain 的输出将帮助您决定哪一列需要索引和其他有用信息。

mysql 文档中所述:

当您在 SELECT 语句之前加上关键字 EXPLAIN 时,MySQL 会显示来自优化器的有关查询执行计划的信息。也就是说,MySQL 解释了它将如何处理该语句,包括有关表如何连接以及以何种顺序连接的信息。

运行这个:

    EXPLAIN SELECT * FROM results r 
    INNER JOIN categories c on r.id = c.result_id 
    INNER JOIN tags t on r.id = t.result_id 
    WHERE c.name in ('purchase', 'single_family', 'other')

    AND ( r.scope = 'all' OR r.scope = 'hi' )
    AND published = 1
GROUP BY r.id
    HAVING COUNT(c.c_id) >= 3
    ORDER BY r.usefulness DESC
    LIMIT 8 OFFSET 0
于 2013-04-16T09:54:20.290 回答
0

当你想让你的查询更快时,你可以做 3 件事:

  • 添加索引c.name(慢查询表明您没有任何索引)
  • 添加countcategories(上面有索引),它将包含缓存的数据
    WHERE c.count >= 3 将只获取有限数量的结果
    HAVING COUNT() >= 3必须在返回之前获取所有结果
  • 如果可能,请使用WHERE c.id IN (...) 而不是WHERE c.name in ('...)...
    id= identification= PRIMARY KEY,这就是它的本意
于 2013-04-16T09:56:49.267 回答
0

您在这里不需要fulltext索引;常规索引是 mySQL 将要用于该字段的内容。

全文索引旨在与全文搜索(即MATCH .. AGAINST查询)一起使用;IN ()它与简单的等号或查询无关。

于 2013-04-16T09:52:03.937 回答
-1

1) 仅选择您的答案列所必需的。2)设置正确的表索引。您也可以使用获取一些信息EXPLAIN SELECT ...

于 2013-04-16T09:51:27.713 回答