3

クライアントのメールアドレスが 35 万件までの DB を保持しています。

彼らは、削除したい合計約 150,000 の電子メール アドレスを含む 2 つの Excel スプレッドシートを私に提供してくれました (簡単に言えば、彼らが手に入れて、バウンス バックを削除したいのは、スパムのような電子メール リストでした)。

検索と置換の驚異を利用して、この大量の削除を実行するクエリを作成しましたが、クエリに時間がかかりすぎてタイムアウトになりました (驚くことではありません)。

私が作成したクエリは次の形式です。

DELETE FROM emaillist
WHERE intListID = 68
AND
(strEmailAddress = "aaaa@aaaa.com"
OR strEmailAddress = "aaab@aaaa.com"
OR strEmailAddress = "aaac@aaaa.com"
......
etc etc etc
......
OR strEmailAddress = "zzzy@zzzz.com"
OR strEmailAddress = "zzzz@zzzz.com"
)

これを行うより良い方法はありますか?

4

3 に答える 3

10

削除するメールを一時テーブルに入れます。次に、結合を使用して元のテーブルからメールを削除できます

DELETE e 
FROM emaillist e
INNER JOIN temp_table t ON t.strEmailAddress = e.strEmailAddress
WHERE intListID = 68

その後、一時テーブルをドロップして完了です。

于 2013-09-03T14:31:50.797 に答える
2

次の手順をお勧めします。

  1. Excel のメールを「todelete」に読み込む
  2. 「todelete」テーブルのメール フィールドにインデックスを作成する
  3. 必要な値で新しいテーブルを作成します。

    create table newemails as select * from emaillist where not exists (select 1 from todelete where todelete.email = emaillist.email);

  4. メーリングリストを切り捨てる

  5. リストを挿入し直します

とはいえ、次のクエリを使用すると、手順 (1) と (2) で十分であることがわかる場合があります。

delete from emaillist
    where not exists (select 1 from todelete where todelete.email = emaillist.email);

ただし、150,000 行を削除すると、ログに大量のトラフィックが生成されます。切り捨てと再挿入により、このオーバーヘッドが節約されます。

于 2013-09-03T14:33:08.647 に答える