jdbcを使用してmysql dbでバッチ削除を実行する方が良い方法はありますか?mysqlのパフォーマンス
私は主キーのリストを持っています。それらを削除する必要があります。
- バッチ更新APIを使用します。
- where節にin節を持つdeleteです。
jdbcを使用してmysql dbでバッチ削除を実行する方が良い方法はありますか?mysqlのパフォーマンス
私は主キーのリストを持っています。それらを削除する必要があります。
WHERE句にINを使用すると、データ転送が高速になります。しかし、クエリが長すぎると、MySQLはそれを解析する時間がかかるのでとトレードオフがあります。削除するレコードが多すぎる場合は、10Kの長さのクエリに分割することをお勧めします。
別の解決策は、あなたが削除する、あまりにも多くのレコードを持っている、とあなたは別のクエリでそれらを取得するとき、あなたは例えば、直接使用することができます:
DELETE FROM table1 WHERE id IN (SELECT id FROM table2 WHERE status = 1)
私は同様の問題を持つとすることを決めました。プリペアドステートメントとJDBCドライバを使用した2つのアプローチをベンチマークします。私のアプリケーションは、3つの(重度のインデックスが作成された)テーブルを持っています。私は、各テーブルから削除する必要があるキーのリストを取得するためのクエリを持っています(キーは3つのテーブルすべてとそのうちの1つのプライマリキーでインデックスされています)。
まず私が試した:
for each delete_id
DELETE FROM table1 WHERE table1.id = delete_id
DELETE FROM table2 WHERE table2.id = delete_id
DELETE FROM table3 WHERE table3.id = delete_id
loop
で
SELECT id FROM table1 WHERE delete_condition
を、私は、これは毎秒74行の削除率を提供しました。
第二のアプローチ:
DELETE FROM table2 WHERE table1.id IN (SELECT id FROM table1 WHERE delete_condition)
DELETE FROM table3 WHERE table1.id IN (SELECT id FROM table1 WHERE delete_condition)
DELETE FROM table1 WHERE table1.id IN (SELECT id FROM table1 WHERE delete_condition)
は、毎秒43026個の行の削除率を提供しました。私はMySQLのフードの下で何が起こっているのか分かりませんが、私はDELETE FROMテーブルWHERE id IN()アプローチを使用しています。
私はそれが実際にこれを知っている圧倒的多数ではないと思います。しかし、これはテストするのが非常に簡単なので、もしあなたがそれを取得したら、私たちに教えてください。 –