リモートDBから数十万の順序で行を削除しています。各削除には、独自のターゲットがあります。
DELETE FROM tablename
WHERE (col1=c1val1 AND col2=c2val1) OR (col1=c1val2 AND col2=c2val2) OR ...
これは私にとって個々のクエリのほぼ2倍の速さでしたが、SQLをあまり長く使用していないので、これをさらに高速化する方法があるかどうか疑問に思いました。
一時テーブルを作成し、行ごとに1つずつ、すべての値のペアを入力します。列に、の一致する列と同じ名前を付けますtable
。
CREATE TEMPORARY TABLE donotwant (
col1 INT NOT NULL,
col2 INT NOT NULL,
PRIMARY KEY (c1val, c2val)
);
INSERT INTO donotwant VALUES (c1val1, c2val1), (c1val2, c2val2), ...
次に、これらのテーブル間のJOINに基づいて複数テーブルの削除を実行します。
DELETE t1 FROM `tablename` AS t1 JOIN `donotwant` USING (col1, col2);
USING句はON t1.col1=donotwant.col1 AND t1.col2=donotwant.col2
、列の名前が両方のテーブルで同じであり、両方の列が結合されたテーブルの名前と同じである結合条件が必要であると仮定して、の省略形です。
一般的に、バルクを実行する最も速い方法は、DELETE
削除するIDをある種の一時テーブルに入れ、それをクエリの一部として使用することです。
DELETE FROM table
WHERE (col1, col2) IN (SELECT col1, col2
FROM tmp)
挿入は、標準を介して行うことができます。
INSERT INTO tmp VALUES (...), (...), ...;
ステートメント、またはDBのバルクロードユーティリティを使用します。
それがパフォーマンスに大きな違いをもたらすとは思えませんが、そのようなことをこのように書くことができます...
DELETE
FROM table
WHERE (col1,col2) IN(('c1val1','c2val1'),('c1val2','c2val2')...);