Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Group By连接的MySQL中查询性能差_Mysql_Sql - Fatal编程技术网

使用Group By连接的MySQL中查询性能差

使用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)

我有一个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
,它有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个月了。我真丢脸。。。