我有一个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条记录-这不是一个巨大的表!其他表要小得多。

说明结果:


我该怎么做才能提高查询性能?

最佳答案

这是查询:

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;


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

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

我不知道double date_add()应该完成什么。添加interval 0 hour不会执行任何操作。这些操作不会影响性能,但是看起来很尴尬。

关于mysql - MySQL与Group By结合使用时查询性能不佳,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29147777/

10-12 13:53
查看更多