[英]Very slow MySQL query
該查詢需要花費很長的時間才能執行。 持續時間/獲取:89.778秒/0.000秒
這是查詢:
SELECT tblcompanyoperat.COPSCountry,
AVG(tbldshipfees.Dship Total AnnualUSD) /
AVG(tblcopsyearonyear.COPSMinWageUSD) AS Expr1
FROM (SELECT tblcopsyearonyear.Company NAME,
tblcopsyearonyear.COPSCountry,
MAX(tblcopsyearonyear.COPSFinYearEnd) AS MaxOfCOPSFinYearEnd
FROM tblcopsyearonyear
GROUP BY tblcopsyearonyear.Company NAME,
tblcopsyearonyear.COPSCountry
ORDER BY tblcopsyearonyear.COPSCountry,
MAX(tblcopsyearonyear.COPSFinYearEnd)) AS qryCOPSLatestInfoYr,
((tblcompany
INNER JOIN tblcompanyoperat
ON tblcompany.CompName = tblcompanyoperat.Company NAME)
INNER JOIN tblcopsyearonyear
ON tblcompanyoperat.COMPOPID = tblcopsyearonyear.COMPOPID)
INNER JOIN (tbldirectorships
INNER JOIN tbldshipfees
ON tbldirectorships.DIRECTORSHIPSID = bldshipfees.DSHIPID)
ON tblcompany.CompName = tbldirectorships.DSHIPCOMPANYLINK
WHERE blcompany.CompSector = 'Retail'
GROUP BY tblcompany.CompSector,
blcompanyoperat.COPSCountry,
tbldshipfees.DSHIP Position
HAVING (AVG(tblcopsyearonyear.COPSMinWageUSD) IS NOT NULL
AND tbldshipfees.DSHIP Position LIKE 'Chief%')
ORDER BY MAX(qryCOPSLatestInfoYr.MaxOfCOPSFinYearEnd);
除了索引編制之外,我還可以使用哪些優化來加快處理速度? 解釋擴展輸出:
id selet_type table type possible_keys key key_len ref rows filtered Extra
1, PRIMARY, tblcompany, ref, PRIMARY,tblSECTORStblCOMPANY, tblSECTORStblCOMPANY, 768, const, 7, 100.00, Using where; Using index; Using temporary; Using filesort
1, PRIMARY, tblcompanyoperat, ref, PRIMARY,CompanyName, CompanyName, 768, lrsmnc.tblcompany.CompName, 3, 100.00, Using where
1, PRIMARY, tblcopsyearonyear, ref, PRIMARY,COMPOPID, COMPOPID, 4, lrsmnc.tblcompanyoperat.COMPOPID, 1, 100.00,
1, PRIMARY, tbldirectorships, ref, PRIMARY,DIRECTORSHIPSID,tblCOMPANYtblDIRECTORSHIPS, tblCOMPANYtblDIRECTORSHIPS, 768, lrsmnc.tblcompanyoperat.Company Name, 12, 100.00, Using where; Using index
1, PRIMARY, tbldshipfees, ref, DSHIPID,tbldshipfeesDSHIPID, DSHIPID, 4, lrsmnc.tbldirectorships.DIRECTORSHIPSID, 1, 100.00,
1, PRIMARY, <derived2>, ALL, 310, 100.00, Using join buffer
2, DERIVED, tblcopsyearonyear, ALL, 523, 100.00, Using temporary; Using filesort
將tbldshipfees.DSHIP Position LIKE 'Chief%'
從HAVING
子句移動到WHERE
子句將縮短執行時間。 這有兩個原因。
首先,對MySQL的HAVING
子句中出現的項目不做任何優化。 這意味着可能無法使用索引排除項目(如上面的EXPLAIN
計划中所示)。
其次,由於在將數據返回給客戶端之前立即應用了HAVING
子句。 結果,在刪除所有操作(聚合函數,ORDER BY等)之前,它們不必要地花費了時間,從而增加了處理時間。
參考: http : //dev.mysql.com/doc/refman/5.5/en/select.html
另外,由於將來的維護原因,根據X-Zero的評論,建議從隱式聯接更改為顯式聯接。 這可能會帶來其他性能優勢,因為它減少了數據庫服務器所需的優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.