此查询执行的时间非常长。持续时间/取指: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
答案 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的评论,建议从隐式连接更改为显式连接。这可能会带来额外的性能优势,因为它减少了数据库服务器所需的优化。