2015-08-14 170 views
0

我在下面有一個sql,它運行了大約30分鐘,這對我來說太長了。在MySQL中查詢SQL運行速度很慢

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 

的解釋如下結果(告訴我,如果你不能查看圖像):

http://images0.cnblogs.com/blog2015/47012/201508/140920298959608.png

我觀看了輪廓的結果,「複製臨時數據」浪費了幾乎所有的時間。我知道原因是由「group by」功能引起的,所以我在下面做了一些更改以驗證它: 我刪除了MAX,SUM函數以及Group By sql並運行它,時間僅需要大約40秒,這對我們是好的。 所以在這裏,我想知道,如果還有其他一些方法讓上面的sql執行速度更快?

更多信息,你可以在這裏找到:http://www.cnblogs.com/scy251147/p/4728995.html

編輯: 從解釋來看,我可以看到,在t_filters_items表,大約有50802行過濾,而這個表不幸運的是使用臨時存儲臨時數據,這對我來說不是一個好選擇。我非常不喜歡MySQL中的「Group By」。

+0

解釋顯示至少兩個正在使用索引的JOINS。請在此處添加您的解釋,請 –

+0

@ BK435,解釋附。 –

+0

@JorgeCampos附加說明。 –

回答

0

請勿在UUID列上使用CHARACTER SET utf8列。改爲ascii。進一步討論uuids以及如何進一步縮小它們:http://mysql.rjweb.org/doc.php/uuid

真的有50K行FI.filterID = '4dce2235-aafd-4ba2-b248-c137ad6ce8ca'

GROUP BY跨越兩個表格(LPPSL),使其無法優化。這可以改變嗎?

SUM(...)可能會有比您預期的更大的價值。這是因爲JOINs。嘗試在子查詢中重寫SUM的計算。

你在使用InnoDB嗎?是否innodb_buffer_pool_size設置爲可用 RAM的約70%?

每個表中大概有多少行?

+0

使用FI.filterID ='4dce2235-aafd-4ba2-b248-c137ad6ce8ca'僅過濾表格,總共有29020行。 –

+0

因此,查詢需要(1)查看29020行「FI」,(2)「JOIN」給其他幾個表,可能會減少或增加基於其他過濾或加入爆炸的29020,最後(3)做'GROUP BY'。 –

+0

1.使用FI.filterID ='4dce2235-aafd-4ba2-b248-c137ad6ce8ca'僅對錶格進行過濾,總共有29020行。 2.不,基於業務邏輯,Group by不能更改。直到現在,我還沒有任何好的想法來改變它。 3.是的,我們使用InnoDB。但尺寸只有46mb! 4。錶行下面計數:t_pupils_offers_services(647778),j_learning_projects_pupils_offers(138702),j_learning_projects_pupils(138182),j_learning_projects_pupils_offers_tracking(736624),t_filters_items(3150753) –

相關問題