0

mysql クエリ (結合なし) によってテーブルから 200 万件を超えるレコードを削除しようとしています。テーブルには約 8,000 万件のレコードがあります。

使用set autocommit=0;しましたが、完了するまでに時間がかかります。でクエリを実行すると、これは速くなりますautocommit=1か?

4

3 に答える 3

2

あなたのテーブルがInnoDBであると仮定しています。この 200 万行については、変更ごとに元に戻すログ エントリを追跡する必要があります。これはメモリに蓄積され、最終的にディスクに入ります。時間がかかるのはそのためです。チャンクで実行すると、ディスクに書き込まれなくなり、MySQL が追跡する Undo ログ エントリが少なくなり、効率が向上します。

自動コミットはクエリの最後に発生するため、何もしません。

チャンク サイズを決定する最善の方法は、実験することです。何かのようなもの

delete from table1 limit 1000;

次に、時間ごとに削除された行の最適な比率が得られるまで、2 倍にし続けます。

于 2013-03-19T14:19:46.160 に答える
1

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 万件のレコードを削除するトランザクションを管理すると、多くのオーバーヘッドが追加されます。

また、一括/範囲削除に使用する列が主キーであるか、インデックスがあることを確認してください。

于 2013-03-19T05:49:18.733 に答える
0

autocommit 変数の値を変更しても、これ以上速くなることはありません。自動コミットが true の場合でも、MySQL は常に古いイメージを作成します。これは、ユーザーがクエリを中断した場合、ロールバックする古いイメージが必要になるためです。

于 2016-08-01T07:21:08.747 に答える