由于使用错误的INDEX而导致的慢GROUP BY查询

时间:2015-12-31 14:05:22

标签: mysql sql

我有一个MySQL(更精确的MariaDB)数据库,它拥有不同的记录和#34; (不要与数据库记录混淆,这些是我的系统使用的数据单元,由多个键值字段组成)。 每个"记录"是"实例"的一部分。 每个"实例都是"用户组"的一部分。 每个"记录"可以成为"类别的一部分"。

我正在尝试编写一个SQL查询来检索用户组的所有类别 - 并检索每个类别下所有实例中存在的记录数量。 我的SQL语句如下所示:

SELECT COUNT( r.id ) AS records_number, c.category
FROM records r
INNER JOIN feeds_instances i ON r.instance = i.id
INNER JOIN feeds_instances_categories c ON c.instance = i.id
WHERE i.user_group = '0'
AND r.reviewed IS NULL
GROUP BY c.category
LIMIT 0 , 30

使用SQL_NO_CACHE测试查询时,我得到0.2秒的查询。删除GROUP BY时,它会减少到0.0008秒。 当我为SQL查询执行EXPLAIN命令时,我得到用于表c的索引是" instance"而不是"类别" (feeds_instances_categories表有三列: id instance category instance 上存在索引类)。

我正在尝试强制GROUP BY使用索引类别。我尝试使用USE INDEX命令,但是我收到了错误。我很可能没有正确地做到这一点,并且无法在文档中找到正确的方法。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

MySQL非常不愿意使用索引进行聚合,因此您可能无法在那里取得成功。

您应确保为查询提供了正确的连接索引和过滤器。这可能是:records(instance, reviewed)feeds_instances(user_group, id)feeds_instances_categories(instance, category)

如果将user_group声明为数字,则删除单引号。令人困惑的字符串和数字也会使优化器混淆。

答案 1 :(得分:0)

您的数据库中有多少个条目。

如果您在没有分组依据的情况下执行查询,则LIMIT将在30个条目之后删除所有内容。但是按功能分组会删除表中的所有条目,然后限制它们。