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

标签 mysql sql

我有一个 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 表有三列:idinstance 类别实例类别 上存在索引。

我试图强制 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/

相关文章:

sql - 聚合 case 语句中 sum 和 count 的区别

mysql - 更新完整的表,交换列

python mysql自定义重新连接类不保持服务器连接打开

mysql - 从另一个表中检索数据

sql - MS SQL 查询 - 如果不存在表

Mysql - 从 3 行中的重复字段设置行的键

mysql - 我无法更改变量 "max_execution_time"

php - mysqli_real_escape_string 不插入数据库

php - 从 MYSQL 数据库中提取 URL 时,我的 PHP cURL 函数不起作用

java - Ebean:如何正确选择值所在的行?