MySQL查询非常慢

时间:2012-08-10 20:14:03

标签: mysql sql

此查询执行的时间非常长。持续时间/取指: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

1 个答案:

答案 0 :(得分:1)

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的评论,建议从隐式连接更改为显式连接。这可能会带来额外的性能优势,因为它减少了数据库服务器所需的优化。