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 に答える