我有一个 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;
此查询的最佳索引是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/