我有一个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中非常多。
答案 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 BY
和LPP
),无法进行优化。可以改变吗?
SL
的价值可能超出预期。这是因为SUM(...)
。尝试重写子查询中JOINs
的计算。
您使用的是InnoDB吗? SUM
是否设置为可用 RAM的约70%?
每张表中大约有多少行?