MySQL5.5をマスター/スレーブレプリケーション(1マスター、2スレーブ)で実行しています。
週に1回実行して特定のテーブルを切り捨てるプロセスがあります。テーブルは大きくなく、数千のレコードしかありません。
何らかの理由で、TRUNCATE TABLE
コマンドの実行に非常に長い時間がかかります(マスターとスレーブの両方で)。実行に約400Kミリ秒かかります!!スレーブで実行すると、マスターから遅れます。 TRUNCATE TABLE
が終了すると、すべてが正常に戻ります。
スレーブの1つは専用スレーブであり、そのスレーブから読み取るプロセスがダウンしていたため、TRUNCATE TABLE
の実行中に読み取りを受信しなかったことを知っています。また、このスレーブでは、実行に同じ時間がかかりました。
これがテーブル構造です: http://Pastebin.com/qEQB4juR
TRUNCATE TABLEをどのように高速化できるかについての考えはありますか?
TRUNCATE TABLE is DDL(Data Definition Language) DML(データ操作)ではないため、InnoDBテーブルでTRUNCATE TABLE
を使用するには、完全なテーブルロックが必要です。
DELETE FROM user_engagements;
を実行しても、MVCC情報はibdata1の取り消しログに書き込まれ、テーブルが空になるのを妨げる可能性があるため、役に立ちません。コミットされていないトランザクションがuser_engagements
を保持している場合、TRUNCATE TABLE
も保持される可能性があります。
テーブルの名前を変更して、すぐに使用できるようにすることができます
SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE user_engagements_new LIKE user_engagements;
ALTER TABLE user_engagements RENAME user_engagements_zap;
ALTER TABLE user_engagements_new RENAME user_engagements;
DROP TABLE user_engagements_zap;
SET FOREIGN_KEY_CHECKS = 1;
これは、最後のステートメントを除いて、迅速に複製されます。
試してみる !!!
MySQL 5.1.16+を使用している場合、TRUNCATE TABLE
には [〜#〜] drop [〜#〜] 権限が必要です。私の答えは、TRUNCATE TABLE
が現在行っていることを実行します。
MySQL 5.1.15以降を使用している場合は、 [〜#〜] delete [〜#〜] 権限が必要です。