使用Group By连接的MySQL中查询性能差
我有一个MySQL查询,始终需要7秒才能完成:使用Group By连接的MySQL中查询性能差,mysql,sql,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)
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
,它有13216条记录——不是一个大表!其他的桌子小得多
解释结果:
如何提高查询性能?这是查询:
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;
此查询的最佳索引是组的复合索引
:组(OrganizationId、IsActive、IsDeleted、IsHidden、CreateDate、GroupId)
。最后三列用于涵盖where
子句。然后是时间表(GroupId,EventDate)
上的索引。schedule(GroupId)
上缺少索引可能是性能问题的根源
接下来,您将按s.EventDate
进行订购。这没有道理。您没有选择s.eventDate
,并且当有多个值时,它的定义不正确
我不明白双重
date\u add()
应该完成什么。添加间隔0小时
没有任何作用。这些操作不会影响性能,但看起来很尴尬。执行计划怎么说?为什么要添加0小时的日期?我添加了组的复合索引,但毫无帮助。同样的速度。然后我添加了schedule(GroupId,EventDate)和WOW-query的组合,现在运行时间为47毫秒!!非常感谢。在我的应用程序的上下文中,按eventdate排序是有意义的。间隔0小时是动态的,有时会有一个值。就在这个例子中,没有。确实很好。沙扎姆!!!我可怜的用户已经忍受了6个月了。我真丢脸。。。