【问题标题】:truncate table taking very long time, is it normal?截断表需要很长时间,这正常吗?
【发布时间】:2013-07-20 12:39:33
【问题描述】:

我正在使用截断表 table_name;在一个大约有 100 万行的表上,但运行时间太长了,从过去 3 小时开始运行。

正常吗?您能否建议一些其他方法来删除表中的所有行,这可能会更快?

【问题讨论】:

  • 另外,请查看:bugs.mysql.com/bug.php?id=68184
  • 你机器上的统计数据是什么?
  • 我已经杀死了查询,当我杀死它的时候已经删除了 60 万条记录,但是由于数据对我来说并不重要,所以我只是将旧表的结构复制到一个新表中然后删除旧的。

标签: mysql


【解决方案1】:

截断在某些情况下不起作用,例如,

当你有索引类型的东西和一些外键约束时

我建议的简单方法是

RENAME TABLE table_name TO t1;

CREATE TABLE table_name LIKE t1;

DROP TABLE t1;

或者你也可以使用DELETE FROM table_name;

【讨论】:

  • 这为我们节省了大量时间 - 由于外键引用,截断无法正常工作,但我们需要删除大小约为 22GB(超过 23M 行)的日志记录表,而这让它变得更快。
【解决方案2】:

我相信你的查询执行过程中会发生死锁,所以最好杀死它。

我曾经通过在单个查询中删除小块来删除大量数据(10k 可以正常工作)。

因此,您可以编写一些脚本来为您执行此操作。

【讨论】:

  • 如果截断速度很慢,我正在考虑创建一个具有相同结构的新表,然后删除旧表,我认为这会很快。请分享您对此的看法。
  • 我遇到的问题是一个陈旧的连接被卡在对表的提交中,所以它被冻结了。
【解决方案3】:

给定问题已记录在 mysql repo 中。更多详情请访问https://bugs.mysql.com/bug.php?id=68184

在我的情况下,我试图使用 JDBC 对表进行 trucate 但由于上述原因,我无法做到这一点。 所以正在经历以下替代方案。

    String createTmpTable = "create table tmp_" + tableName + " like " + tableName;
    String dropTable = "drop table " + tableName;
    String reCreateTable = "create table " + tableName + " like tmp_" + tableName;
    String droptmpTable = "drop table tmp_" + tableName;

【讨论】:

    猜你喜欢
    • 2020-08-26
    • 2010-09-28
    • 2018-06-04
    • 2021-12-23
    • 2019-09-30
    • 2020-06-14
    • 2021-11-13
    • 2011-07-15
    • 1970-01-01
    相关资源
    最近更新 更多