查询SQL在MySQL中以group by运行缓慢

时间:2015-08-14 01:49:56

标签: mysql performance

我有一个sql,它运行大约30分钟,这对我来说太长了。

SELECT LPP.learning_project_pupilID, SL.serviceID, MAX(LPPO.start_date), SUM(LPPOT.license_mode_value) totalAssignedLicenses
      FROM t_services_licenses SL 
      INNER JOIN t_pupils_offers_services POS ON POS.service_licenseID = SL.service_licenseID 
      INNER JOIN j_learning_projects_pupils_offers LPPO ON LPPO.learning_project_pupil_offerID = POS.learning_project_pupil_offerID
      INNER JOIN j_learning_projects_pupils LPP ON LPPO.learning_project_pupilID = LPP.learning_project_pupilID
      INNER JOIN j_learning_projects_pupils_offers_tracking LPPOT ON LPPOT.pupil_offer_serviceID = POS.pupil_offer_serviceID
      INNER JOIN t_filters_items FI ON FI.itemID = LPP.learning_project_pupilID_for_filter_join  
      WHERE FI.filterID = '4dce2235-aafd-4ba2-b248-c137ad6ce8ca' 
      AND SL.serviceID IN ('OnlineConversationClasses', 'TwentyFourSeven')
      GROUP BY LPP.learning_project_pupilID, SL.serviceID

下面的解释结果(告诉我你是否可以查看图像):

https://msdn.microsoft.com/en-us/library/microsoft.win32.filedialog.checkfileexists(v=vs.110).aspx

我查看过个人资料结果,"复制临时数据"几乎所有时间都浪费了。我知道原因是由" group by"功能,所以我在下面做了一些更改来验证它: 我删除了MAX,SUM函数以及Group By sql并运行它,时间只需要大约40秒,这对我们来说没问题。 所以在这里,我想知道,如果还有其他一些方法可以让上面的sql执行得更快?

更多信息,您可以在此处找到:http://images0.cnblogs.com/blog2015/47012/201508/140920298959608.png

修改 从解释视图中,我可以看到在t_filters_items表中,有大约50802行被过滤,而这个表并不幸运使用临时存储临时数据,这对我来说不是一个好选择。我真的不喜欢" Group By"在MySQL中非常多。

1 个答案:

答案 0 :(得分:0)

请勿在{{1​​}}列上使用CHARACTER SET utf8。改为ascii。进一步讨论uuids以及如何进一步缩小它们:http://mysql.rjweb.org/doc.php/uuid

UUID确实有50K行?

FI.filterID = '4dce2235-aafd-4ba2-b248-c137ad6ce8ca'跨越两个表格(GROUP BYLPP),无法进行优化。可以改变吗?

SL的价值可能超出预期。这是因为SUM(...)。尝试重写子查询中JOINs的计算。

您使用的是InnoDB吗? SUM是否设置为可用 RAM的约70%?

每张表中大约有多少行?