由于使用了错误的INDEX,GROUP BY查询缓慢



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

我正在尝试编写一个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",而不是"category"(feeds_instances_categories表有三列:idinstancecategory。索引存在于instanceategory上)。

我试图强制GROUP BY使用索引类别。我尝试使用USE INDEX命令,但出现错误。我很可能做得不正确,在文档中找不到如何正确地做。

任何帮助都将不胜感激!

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

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

如果user_group被声明为数字,那么去掉单引号。混淆字符串和数字也会混淆优化器。

数据库中有多少条目。

如果您在没有分组的情况下超过查询,则LIMIT将在30个条目后全部剪切。但按函数分组会列出表中的所有条目,然后限制它们。

最新更新