我有以下查询,这两个表都很大。查询非常慢,我需要您的想法来优化此查询,或者您还有其他解决方案吗?
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,我已经应用了适当的索引。
更新
好的,我附上了解释结果。
答案 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,这可能是一个巨大的性能问题,并且可能会占用磁盘上的大量内存和临时空间。