MySQL查询优化和/或调整

时间:2012-10-17 02:58:01

标签: mysql sql mysqli sql-optimization

我有以下查询,这两个表都很大。查询非常慢,我需要您的想法来优化此查询,或者您还有其他解决方案吗?

SELECT c.EstablishmentID,
   (SELECT COUNT(ID) 
    FROM cleanpoi 
    WHERE EstablishmentID=c.EstablishmentID OR EstablishmentID 
    IN (SELECT ChildEstablishmentID 
        FROM crawlerchildren 
        WHERE ParentEstablishmentID=c.EstablishmentID)
    ) POI 
FROM crawler c 
GROUP BY c.EstablishmentID

BTW,我已经应用了适当的索引。

更新

好的,我附上了解释结果。enter image description here

2 个答案:

答案 0 :(得分:0)

使用JOIN

尝试
SELECT  c.EstablishmentID, COUNT(d.ID)
FROM    crawler c
        LEFT JOIN cleanpoi d
            ON c.establishmentid = d.establishmentID
        LEFT JOIN
        (
            SELECT DISTINCT ChildEstablishmentID
            FROM crawlerchildren
        ) e ON e.ParentEstablishmentID = c.EstablishmentID
GROUP BY c.EstablishmentID

答案 1 :(得分:0)

IN()和NOT IN()子查询的优化程度很低:

MySQL将子查询作为外部查询中每一行的从属子查询执行。这是MySQL 5.5及更早版本中严重性能问题的常见原因。该查询可能应分别重写为JOIN或LEFT OUTER JOIN。

非确定性GROUP BY: SQL检索既不在聚合函数中也不在GROUP BY表达式中的列,因此这些值在结果中将是不确定的。

不同表格上的GROUP BY或ORDER BY:

这将强制使用临时表和filesort,这可能是一个巨大的性能问题,并且可能会占用磁盘上的大量内存和临时空间。