web-dev-qa-db-ja.com

TRUNCATE TABLEに非常に長い時間がかかる原因は何ですか?

MySQL5.5をマスター/スレーブレプリケーション(1マスター、2スレーブ)で実行しています。

週に1回実行して特定のテーブルを切り捨てるプロセスがあります。テーブルは大きくなく、数千のレコードしかありません。

何らかの理由で、TRUNCATE TABLEコマンドの実行に非常に長い時間がかかります(マスターとスレーブの両方で)。実行に約400Kミリ秒かかります!!スレーブで実行すると、マスターから遅れます。 TRUNCATE TABLEが終了すると、すべてが正常に戻ります。

スレーブの1つは専用スレーブであり、そのスレーブから読み取るプロセスがダウンしていたため、TRUNCATE TABLEの実行中に読み取りを受信しなかったことを知っています。また、このスレーブでは、実行に同じ時間がかかりました。

これがテーブル構造です: http://Pastebin.com/qEQB4juR

TRUNCATE TABLEをどのように高速化できるかについての考えはありますか?

8
Ran

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 [〜#〜] 権限が必要です。

8
RolandoMySQLDBA