2011-10-10 66 views
0

我有一个包含子查询的批量查询。当我在开发服务器上运行它时,我的查询工作正常,但是当我在实时服务器上尝试它时,查询花费太多时间来生成输出。我认为这是因为活服务器上的大数据。任何人都可以帮助我如何索引MySQL的查询,以减少时间执行。在MySQL上建立索引

这里是我的查询:

SELECT prd.fldemployeeno AS Empno, 
     (SELECT fldemployeename FROM tblprofile prf WHERE prf.fldemployeeno = prd.fldemployeeno LIMIT 0,1) AS Empname, 
     '01' AS `Week`, 
     COUNT(DISTINCT isAud.fldid) AuditedFiles, 
     COUNT(qua.seqid) ErrorCount, 
     COUNT(DISTINCT qua.fldid) OrdersWithError 
    FROM tbldownloadITL dwn 
INNER JOIN tblproductionITL prd 
    ON dwn.fldid = prd.fldglobalid 
INNER JOIN (SELECT p.fldemployeeno,fldglobalid,p.fldstarttime,COALESCE(q.fldstarttime,p.fldstarttime) `AuditDate` 
       FROM tblproductionitl p 
       LEFT JOIN tblqualityaudit q 
       ON p.fldemployeeno=q.fldemployeeno 
       AND p.fldstarttime=q.fldprodstarttime 
       AND p.fldglobalid=q.fldid 
       WHERE p.fldprojectgroup='PROJGROUP') temp 
    ON prd.fldglobalid=temp.fldglobalid 
    AND prd.fldemployeeno=temp.fldemployeeno 
    AND prd.fldstarttime=temp.fldstarttime 
INNER JOIN tblisauditedITL isAud 
USING (fldid) 
    LEFT JOIN tblqualityaudit qua 
    ON qua.fldid = dwn.fldid 
    AND qua.fldbusunit = dwn.fldbusunit 
    AND qua.fldprojectGroup = dwn.fldprojectGroup 
    AND qua.fldemployeeno = prd.fldemployeeno 
    AND qua.fldprodstarttime = prd.fldstarttime 
    AND qua.flderrorstatus != 'NOT ERROR' 
    LEFT JOIN tblerrorcategory 
USING (flderrorcategoryid) 
    LEFT JOIN tblerrortypes 
USING (flderrortypeid) 
WHERE dwn.fldbusunit = 'BUSUNIT' 
    AND dwn.fldprojectGroup = 'PROJGROUP' 
    AND temp.AuditDate BETWEEN '2011-07-29 00:00:00' AND '2011-07-29 23:59:59' 
GROUP BY prd.fldemployeeno 
ORDER BY Empname 

这里也是查询的描述:

enter image description here

+1

上''是什么可能速度变慢了很多临时/文件排序。我很难看出你的sql的哪个部分导致了这一点。 – imm

回答

1

我建议在服务器上安装狮身人面像,如果你有访问。这样,您可以在指尖获取索引资源以进行极快搜索,除此之外,您还可以添加所谓'delta'索引的执行,以便实时更新mysql数据库。它是高度可定制的。希望这会帮助你。

http://sphinxsearch.com/