1

以下のクエリを実行すると、「クエリ中に MySQL サーバーへの接続が失われました」というエラーが発生します。どうすれば修正できますか?

SELECT * 
FROM firmalar,
     musterisahipleri,
     notlar 
WHERE firmalar.firmaID NOT IN (
       SELECT m2.firmaID 
       FROM notlar AS n2,
            musterisahipleri AS m2
       WHERE n2.eklemeTarihi > '2013-03-24'
   ) 
   AND musterisahipleri.firmaID = firmalar.firmaID 
   AND notlar.ilgiliID = musterisahipleri.userID;

ご協力いただきありがとうございます

4

2 に答える 2

5

非効率的なネストされたサブクエリを使用しているため、タイムアウトしています。

これにより、パフォーマンスが向上します。

編集: 最後のコメントによると、このクエリは、「2013-03-24」以降にレコードが追加されfirmalarていないレコードを返します...その後、それらの結果を何度も結合して、関連する担当者とメモを取得します (該当する場合)notlarmusterisahiplerinotlar

SELECT *
FROM (
    SELECT f.* 
    FROM firmalar AS f
    LEFT JOIN musterisahipleri AS m
        ON m.firmaID = f.firmaID
    LEFT JOIN notlar AS n
        ON n.ilgiliID = m.userID
        AND n.eklemeTarihi > '2013-03-24'
    GROUP BY f.firmaID
    HAVING MAX(n.ilgiliID) IS NULL
) AS f
    LEFT JOIN musterisahipleri AS m
        ON m.firmaID = f.firmaID
    LEFT JOIN notlar AS n
        ON n.ilgiliID = m.userID

また、結合している列にインデックスがあることを確認する必要があります。

ALTER TABLE firmalar ADD INDEX (firmaID);
ALTER TABLE musterisahipleri ADD INDEX (firmaID);
ALTER TABLE musterisahipleri ADD INDEX (userID);
ALTER TABLE notlar ADD INDEX (ilgiliID);
于 2013-05-25T11:54:27.443 に答える