mysql クエリ (結合なし) によってテーブルから 200 万件を超えるレコードを削除しようとしています。テーブルには約 8,000 万件のレコードがあります。
使用set autocommit=0;
しましたが、完了するまでに時間がかかります。でクエリを実行すると、これは速くなりますautocommit=1
か?
mysql クエリ (結合なし) によってテーブルから 200 万件を超えるレコードを削除しようとしています。テーブルには約 8,000 万件のレコードがあります。
使用set autocommit=0;
しましたが、完了するまでに時間がかかります。でクエリを実行すると、これは速くなりますautocommit=1
か?
あなたのテーブルがInnoDBであると仮定しています。この 200 万行については、変更ごとに元に戻すログ エントリを追跡する必要があります。これはメモリに蓄積され、最終的にディスクに入ります。時間がかかるのはそのためです。チャンクで実行すると、ディスクに書き込まれなくなり、MySQL が追跡する Undo ログ エントリが少なくなり、効率が向上します。
自動コミットはクエリの最後に発生するため、何もしません。
チャンク サイズを決定する最善の方法は、実験することです。何かのようなもの
delete from table1 limit 1000;
次に、時間ごとに削除された行の最適な比率が得られるまで、2 倍にし続けます。
200 万の個別の削除ステートメントを実行しようとしていると仮定します。
主キーまたは範囲を使用して一度に 100 ~ 1000 レコードを削除する一括削除を試みると、はるかに高速になります。
例:
DELETE FROM Table WHERE ID > 0 AND ID < 1000;
また
DELETE FROM Table WHERE ID IN (1,2,3,4,5 .... 1000);
削除するレコードの数は好みに合わせて調整でき、必要に応じてかなり増やすことができます。高負荷の運用サーバーでは、通常、このような範囲の狭いスクリプトをおそらく 100 回実行してから、少しスリープしてから別のループに進みます。
この種のことについては、常に自動コミットをオンにしています。200 万件のレコードを削除するトランザクションを管理すると、多くのオーバーヘッドが追加されます。
また、一括/範囲削除に使用する列が主キーであるか、インデックスがあることを確認してください。
autocommit 変数の値を変更しても、これ以上速くなることはありません。自動コミットが true の場合でも、MySQL は常に古いイメージを作成します。これは、ユーザーがクエリを中断した場合、ロールバックする古いイメージが必要になるためです。