MySQL中的查询性能较差加入Group By

时间:2015-03-19 14:51:46

标签: 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条记录 - 不是一张巨大的表!其他表格要小得多。

EXPLAIN结果: enter image description here

我可以做些什么来提高查询效果?

1 个答案:

答案 0 :(得分:2)

这是查询:

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无效。这些操作不会影响性能,但看起来很尴尬。