是什么导致TRUNCATE TABLE花费很长时间?


9

我正在运行具有主/从复制(1个主,2个从)的MySQL5.5。

我有一个每周运行一次并截断特定表的过程。该表不是很大,只有几千条记录。

出于某种原因,该TRUNCATE TABLE命令的执行时间非常长(在主机和从机上)。执行大约需要40万毫秒!当它在从属服务器上运行时,它将导致它滞后于主服务器。在后TRUNCATE TABLE结束,一切恢复正常。

我知道一个从站在执行时没有收到任何读取,TRUNCATE TABLE因为它是一个专用的从站,并且从该从站读取的进程已关闭。同样,在该从站上,执行所花费的时间相同。

表格结构如下:http : //pastebin.com/qEQB4juR

关于如何加快TRUNCATE TABLE的任何想法?


桌子上有隔板吗?
Barbaros Alp 2014年

Answers:


8

使用TRUNCATE TABLE上一个InnoDB表需要全表锁,因为TRUNCATE TABLE是DDL(数据定义语言)不DML(数据操作)。

这样做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 TABLE为了使重命名成为原子:RENAME 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年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.