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

Ran*_*Ran 9 mysql replication truncate mysql-5.5

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

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

出于某种原因,该TRUNCATE TABLE命令需要很长时间才能执行(在主机和从机上)。执行大约需要 400K 毫秒!!当它在从站上运行时,会导致它滞后于主站。在后TRUNCATE TABLE结束,一切恢复正常。

我知道其中一个从站在执行时没有收到任何读取,TRUNCATE TABLE因为它是一个专用的从站,并且从该从站读取的进程已关闭。此外,在此从属设备上,执行所需的时间相同。

这是表结构:http : //pastebin.com/qEQB4juR

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

Rol*_*DBA 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;
Run Code Online (Sandbox Code Playgroud)

除了最后一条语句外,这应该会快速复制。

试一试 !!!

如果你有 MySQL 5.1.16+,TRUNCATE TABLE需要DROP权限。我的回答执行TRUNCATE TABLE现在所做的。

如果您有 MySQL 5.1.15 及以后版本,则需要DELETE权限,我的回答涵盖了该权限。

  • 我会使用多部分的“RENAME TABLE”语句而不是“ALTER TABLE”来使重命名原子化:“RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements;”另一个考虑是“DROP TABLE”导致 LRU_mutex在扫描 LRU 列表并删除每个条目时被锁定 - 这将停止您的服务器。Percona Server 有 `innodb_lazy_drop_table` 来帮助解决这个问题,但是 `DROP TABLE` 在 ext 文件系统上仍然需要很长时间。 (2认同)