web-dev-qa-db-ja.com

MySQLレコードを削除する高速な方法

データベーステーブルに120万のレコードがあります(インデックス列も使用しています)

古い100万件のレコードを削除したい。私はPhpMyadminを使用してそれをやろうとしましたが、もっと時間がかかります。

DELETE FROM `table` WHERE `id` < 1000000

速くする方法はありますか?

別の質問があります:コマンドラインでSSHクライアントを使用してこれを実行した場合、高速になりますか?

5
user231410

これを行う別の良い方法は、0.2 mlnのレコードを別のテーブルにコピーし、最初のテーブルを1.2 mlnで削除することです。

2
Salvador Dali

削除する前にテーブルのインデックスを無効にし、後で再構築します。

さらにいくつかのオプションがあります。

1)たくさん削除する場合は、テーブルが空になるまでLIMIT句(例:1000)を指定して削除ステートメントをループで実行します。これにより、ステートメントの削除トランザクションが実行ごとに実行する作業が少なくなります。

2)事前に削除するこの日付を分割できる場合(タイムスタンプによる時系列など)、MySQLの新しいバージョンのDROP PARTITIONを使用して、多数の行を即座に削除できます。

1
Andrew

クエリを見ると、削除される行の数が気になります。

どちらが良いですか?

  • 100万行を削除する
  • 200,000行のテーブルを作成する

Deleting the 1,000,000 million rowsをご覧ください

  • 時間がかかる
  • テーブルは同じサイズのまま
  • スペースを再利用するには、OPTIMIZE TABLEを実行する必要があります

Creating a table with 200,000 rowsをご覧ください

  • OPTIMIZE TABLEと同じ時間がかかります
  • ステップが速い
  • スペースの再利用が高速

Creating a table with 200,000 rowsの手順は次のとおりです

テーブルがInnoDBの場合

CREATE TABLE mytablenew LIKE mytable;
INSERT INTO mytablenew SELECT * FROM mytable WHERE id >= 1000000;
DROP TABLE mytable;
ALTER TABLE mytablenew RENAME mytable;

テーブルがMyISAMの場合

CREATE TABLE mytablenew LIKE mytable;
ALTER TABLE mytablenew DISABLE KEYS;
INSERT INTO mytablenew SELECT * FROM mytable WHERE id >= 1000000;
ALTER TABLE mytablenew ENABLE KEYS;
DROP TABLE mytable;
ALTER TABLE mytablenew RENAME mytable;

試してみる !!!

余談ですが、SSHクライアントでこれを実行しても、すべてがサーバー側であるため、違いはありません。

0
RolandoMySQLDBA

回答ありがとうございます。これが私の発見です

1)これには時間がかかります-「削除する前にテーブルのインデックスを無効にし、後で再構築してください。」

2)200000レコードの新しいテーブルを作成する最良の方法

CREATE TABLE mytablenew LIKE mytable;
INSERT INTO mytablenew SELECT * FROM mytable WHERE id >= 1000000;
DROP TABLE mytable;
ALTER TABLE mytablenew RENAME mytable;

このメソッドでは、新しいテーブルの1000000から始まるID(自動インクリメント)。 tiを1から開始するにはどうすればよいですか?

ありがとう

0
user231410