mysql - MySQL 使用 Group By 进行联接时查询性能较差

标签 mysql sql

我有一个 MySQL 查询始终需要 7 秒才能完成:

SELECT g.GroupID, g.GroupName, count(s.EventDate) AS Total 
FROM Groups g 
LEFT JOIN Schedule s 
ON g.GroupID = s.GroupID 
WHERE g.OrganizationID = 2 
AND g.IsActive = 1 
AND IFNULL(g.IsDeleted,0) = 0 
AND IFNULL(g.IsHidden,0) = 0 
AND (s.EventDate > DATE_ADD(NOW(), INTERVAL 0 HOUR) OR g.CreateDate > DATE_ADD(DATE_ADD(NOW(), INTERVAL -1 DAY), INTERVAL 0 HOUR)) 
GROUP BY g.GroupID, g.GroupName 
ORDER BY s.EventDate, g.GroupName;

我已经有以下索引:

ALTER TABLE Groups ADD INDEX (OrganizationID);
ALTER TABLE Groups ADD INDEX (IsActive);
ALTER TABLE Groups ADD INDEX (CreateDate);
ALTER TABLE Groups ADD INDEX (IsDeleted);
ALTER TABLE Groups ADD INDEX (IsHidden);
ALTER TABLE Groups ADD INDEX (GroupName);
ALTER TABLE Schedule ADD INDEX (EventDate);

在添加索引之前,查询花费了 18 秒,所以这已经是一个巨大的改进。但我不明白为什么这个查询仍然需要这么长时间。连接中最大的表是 Schedule,它有 13,216 条记录——不是一个很大的表!其他表要小得多。

解释结果: enter image description here

如何提高查询性能?

最佳答案

这是查询:

SELECT g.GroupID, g.GroupName, count(s.EventDate) AS Total 
FROM Groups g LEFT JOIN
     Schedule s 
     ON g.GroupID = s.GroupID 
WHERE g.OrganizationID = 2 AND
      g.IsActive = 1 AND
      IFNULL(g.IsDeleted,0) = 0 AND
      IFNULL(g.IsHidden,0) = 0 AND
      (s.EventDate > DATE_ADD(NOW(), INTERVAL 0 HOUR) OR g.CreateDate > DATE_ADD(DATE_ADD(NOW(), INTERVAL -1 DAY), INTERVAL 0 HOUR)) 
GROUP BY g.GroupID, g.GroupName 
ORDER BY s.EventDate, g.GroupName;

此查询的最佳索引是groups上的复合索引:groups(OrganizationId, IsActive, IsDeleted, IsHidden, CreateDate, GroupId)。最后三列用于覆盖 where 子句。然后是 schedule(GroupId, EventDate) 上的索引。 schedule(GroupId) 上缺少索引可能是性能问题的根源。

接下来,您将按 s.EventDate 订购。这没有道理。您没有选择 s.eventDate,并且当存在多个值时,它的定义不正确。

我不明白双 date_add() 应该完成什么。添加 interval 0 hour 不会执行任何操作。这些操作并不影响性能,但是看起来很别扭。

关于mysql - MySQL 使用 Group By 进行联接时查询性能较差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29147777/

相关文章:

php - 数据未进入表(mySQL)(没有出现错误)

php - Mysql - SQL 查询计数器每天、每月、每年和总计的 Web 访问量

php - 选择名称相似的行

php - Symfony2 Doctrine,通过外键连接表

sql - 执行 (28 : 6): ORA-00600: internal error code, 参数 : [], [], [], [], []

sql - 将SQL转换为关系代数

sql - 为什么比较数据时 case 语句失败?

mysql - LIKE COUNT 1 但不计入数据库

mysql - 使用单个 Replace 语句更新表

java - 如何使用 JOOQ 刷新数据库连接