/ あるテーブルにあるが別のテーブルにはない行を見つけるための/ MySQLクエリ - mysql、join

あるテーブルにあるが他のテーブルにない行を見つけるためのMySQLクエリ - mysql、join

2つに約25,000のレコードがあるとしましょう。テーブルとそれぞれのデータは同じでなければなりません。テーブルAにはあるがテーブルBにはない行を見つける必要がある場合、これを行うための最も効率的な方法は何でしょうか。

1つのテーブルと1つのテーブルのサブクエリとして試しました NOT IN 結果は、これは10分以上実行され、ほぼ私たちのサイトをクラッシュさせます。

もっと良い方法があるはずです。たぶん、 JOIN

回答:

回答№1の場合は3

希望 LEFT OUTER JOIN 仕事をするだろう

select t1.similar_ID
, case when t2.similar_ID is not null then 1 else 0 end as row_exists
from table1 t1
left outer join (select distinct similar_ID from table2) t2
on t1.similar_ID  = t2.similar_ID // your WHERE goes here

回答№2については2

次のブログ記事を読むことをお勧めします。

1つのテーブルに存在するが欠落している値を選択するための最良の方法 別のもので?

そして徹底的な分析の結果、次のような結論に至ります。

ただし、これら3つの方法[NOT IN, NOT EXISTS, LEFT JOIN] 3つの異なるプランによって実行される3つの異なるプランを生成する コードの断片実行するコード EXISTS 述語は約30% 実行するものより効率が悪い index_subquery そして LEFT JOIN 使用するように最適化 Not exists 方法。

そのため、MySQLで欠損値を検索する最良の方法は、 LEFT JOIN / IS NULL または NOT IN のではなく、 NOT EXISTS.

パフォーマンスを見れば」 NOT IN 満足のいくものではありません。 LEFT JOIN / IS NULL または NOT EXISTS代わりに、次のように、このクエリを最適化するための別の方法をとる必要があります インデックスを追加する.


回答№3の場合は0

つかいます exixtsそして存在しません 代わりに関数

Select * from A where not exists(select * from B);

回答№4の場合は0

左結合します。から mysqlのドキュメント

右側のテーブルに一致する行がない場合ONまたはUSINGで LEFT JOINの一部で、すべての列がNULLに設定されている行が使用されます。 右の表この事実を使ってテーブル内の行を見つけることができます。 他のテーブルには対応するものがありません。

SELECT left_tbl。* FROM left_tbl LE​​FT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.idはNULLです。

この例では、left_tbl内のID値がではないすべての行が検索されます right_tbl(つまり、left_tbl内のすべての行がnoである) right_tblの対応する行)