0

このスレッドでのディスカッション出力は次のクエリです: Mysql JOIN subquery

現在のフィドルを参照してください: http://sqlfiddle.com/#!2/e97cf/22

create table c_contact 
(id INT, 
 name VARCHAR(20), 
 securityid INT
);

create table c_monitoring 
(started DATE, 
 ended DATE DEFAULT NULL, 
 securityid INT
);


SELECT
  c_contact.id,
  c_contact.name,
  c_contact.securityid
FROM c_contact
WHERE c_contact.securityid != ''
  AND c_contact.securityid NOT IN
      (select securityid 
       from c_monitoring 
       where ended is null 
       group by securityid
      )
GROUP BY c_contact.id ;

このクエリをどのように最適化するつもりですか? c_contact テーブルに 100.000 レコード、c_monitoring テーブルに約 10.000 レコードがあります。クエリは 127 の結果行で 30 秒以上かかります。

編集:テーブルを正しくインデックス付けすることでケースが解決されました。

4

2 に答える 2

2

クエリに group by 問題があり (実際には、group by 句を使用しないでください)、それを結合に変換する必要があります。

SELECT
  c.id,
  c.name,
  c.securityid
FROM c_contact c
LEFT JOIN c_monitoring m ON m.securityid = c.securityid
  AND m.ended is null
WHERE c.securityid != ''
AND m.securityid IS NULL

SQLFiddleを参照してください

また、エイリアスを使用してクエリを少し整理しました。

于 2014-01-14T10:29:19.113 に答える