簡體   English   中英

MySQL查詢非常慢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM