0

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

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

顺便说一句,我应用了适当的索引。

更新:

好的,我已经附上了解释结果。在此处输入图像描述

4

2 回答 2

0

IN() 和 NOT IN() 子查询的优化很差:

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

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

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

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

于 2012-10-17T05:26:18.550 回答
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
于 2012-10-17T03:53:37.707 回答