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


9

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

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

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

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

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

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


テーブルにパーティションはありますか?
Barbaros Alp

回答:


8

TRUNCATE TABLEは DML(データ操作)ではなくDDL(データ定義言語)であるTRUNCATE TABLEため、InnoDBテーブルでの使用には完全なテーブルロックが必要です。

こう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権限が必要です。これについては私の回答で説明しています。


2
名前の変更をアトミックにするRENAME TABLE代わりに、マルチパートステートメントを使用しますALTER TABLERENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements; 別の考慮事項はDROP TABLE、LRUリストがスキャンされ、各エントリが削除されている間、LRU_mutexがロックされることです。これにより、サーバーが停止します。Percona Serverはこれinnodb_lazy_drop_tableを支援する必要がありますが、DROP TABLEそれでもextファイルシステムでは長い時間がかかる可能性があります。
アーロンブラウン

truncate tableテーブルのパーティション(1000)が原因で時間がかかっている可能性がありますが、それが解決策につながる場合は削除できますか?
2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.