我有一个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结果:
我可以做些什么来提高查询效果?
答案 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
无效。这些操作不会影响性能,但看起来很尴尬。