我有一个 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 表有三列:id、instance ,类别。实例 和类别 上存在索引。
我试图强制 GROUP BY 使用索引类别。我尝试使用 USE INDEX 命令,但出现错误。我很可能没有正确地做到这一点,并且无法在文档中找到如何正确地做到这一点。
如有任何帮助,我们将不胜感激!
最佳答案
MySQL 非常不愿意使用索引进行聚合,因此您可能不会成功。
您应该确保您有正确的连接索引和查询中的 where 过滤器。这可能是:records(instance, reviewed)
, feeds_instances(user_group, id)
, 和 feeds_instances_categories(instance, category)
.
如果user_group
声明为数字,然后去掉单引号。混淆字符串和数字也会混淆优化器。
关于mysql - 由于使用了错误的 INDEX,GROUP BY 查询缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34547525/