私は3つのテーブルを持っています、最初はメールアドレスのリストです:
addresses:
id - integer, this is the primary key<br>
email - varchar(255) field holding the address
sent:
sid - integer, foreign key references id in addresses table
received:
rid - integer, foreign key references id in addresses table
明らかに、「送信済み」テーブルと「受信済み」テーブルには他の列がありますが、この質問では重要ではありません。送受信テーブルは、電子メールが送受信されるたびに入力され、アドレスが「アドレス」テーブルにまだ含まれていない場合は追加されます。テーブルはかなり大きくなる可能性があります(100,000以上)。
「送信済み」テーブルと「受信済み」テーブルのエントリは定期的に削除され、さまざまな理由でエントリが削除され、「アドレス」テーブルに孤立したエントリが残ります。
「アドレス」テーブルの孤立したエントリを削除するためのMySQLで最も効率的な方法を探しています。私がこれまでに持っているクエリは次のとおりです。
delete
from addresses
where id not in
(select rid from received)
and id not in
(select sid from sent);
これは機能しますが、実行に時間がかかる可能性があり、これを行うための最も効率的な方法ではありません。私もこれを試しました:
delete
from addresses
where not exists
(select 'x' from sent where sent.sid=addresses.id)
and not exists
(select 'x' from rceieved where recieved.rid=addresses.id);
これは少し速かったですが、それでも長い時間がかかります。JOIN構文を使用する必要があると思いますが、この時点でSQLの知識が不足しています。