データベーステーブルに120万のレコードがあります(インデックス列も使用しています)
古い100万件のレコードを削除したい。私はPhpMyadminを使用してそれをやろうとしましたが、もっと時間がかかります。
DELETE FROM `table` WHERE `id` < 1000000
速くする方法はありますか?
別の質問があります:コマンドラインでSSHクライアントを使用してこれを実行した場合、高速になりますか?
これを行う別の良い方法は、0.2 mlnのレコードを別のテーブルにコピーし、最初のテーブルを1.2 mlnで削除することです。
削除する前にテーブルのインデックスを無効にし、後で再構築します。
さらにいくつかのオプションがあります。
1)たくさん削除する場合は、テーブルが空になるまでLIMIT句(例:1000)を指定して削除ステートメントをループで実行します。これにより、ステートメントの削除トランザクションが実行ごとに実行する作業が少なくなります。
2)事前に削除するこの日付を分割できる場合(タイムスタンプによる時系列など)、MySQLの新しいバージョンのDROP PARTITIONを使用して、多数の行を即座に削除できます。
クエリを見ると、削除される行の数が気になります。
どちらが良いですか?
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クライアントでこれを実行しても、すべてがサーバー側であるため、違いはありません。
回答ありがとうございます。これが私の発見です
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から開始するにはどうすればよいですか?
ありがとう