【问题标题】:comparison of truncate vs delete in mysql/sqlserver [duplicate]mysql / sqlserver中截断与删除的比较[重复]
【发布时间】:2013-12-31 19:57:42
【问题描述】:

关于 mysql/sqlserver 的一件事让我印象深刻,即 delete/truncate

哪个更好更快?

在哪里使用删除?

在哪里使用截断?

【问题讨论】:

标签: mysql sql sql-server


【解决方案1】:

删除

  1. DELETE 是一个 DML 命令。
  2. DELETE 语句使用行锁执行,表中的每一行都被锁定以进行删除。
  3. 我们可以在 where 子句中指定过滤器
  4. 如果条件存在则删除指定的数据。
  5. 删除会激活触发器,因为操作是单独记录的。
  6. 比截断慢,因为它保留了日志。
  7. 可以回滚。

截断

  1. TRUNCATE 是一个 DDL 命令。
  2. TRUNCATE TABLE 始终锁定表和页,而不是每一行。
  3. 不能使用 Where 条件。
  4. 它会删除所有数据。
  5. TRUNCATE TABLE 无法激活触发器,因为该操作不记录单个行删除。
  6. 性能更快,因为它不保留任何日志。
  7. 可以回滚。


  • DELETE 和 TRUNCATE 在与 TRANSACTION(TRUNCATE 可以在 SQL Server 中回滚,但不能在 MySQL 中)。
  • 如果有一个自动递增的 PK,截断将 重置计数器

http://beginner-sql-tutorial.com/sql-delete-statement.htm

【讨论】:

  • +1 以获得详细的解释和清晰的格式
  • Truncate 也会将自增值更改为 1。删除不会保留现有的自增值
  • @Onimusha,此点已在最后一行中指定“如果有自动递增的 PK,则截断将重置计数器”
  • @bgs 好吧,我们还是那样。答案可能应该增加上下文,并强调 TRUNCATE 中 MySQL 和 SQL Server 之间的差异。
【解决方案2】:

区别

最重要的区别是 DELETE 操作是事务安全和记录的,这意味着 DELETE 可以回滚。 TRUNCATE 不能在事务内部完成,也不能回滚。因为没有记录 TRUNCATE,所以恢复被错误地截断的表比从 DELETE 中恢复要大得多。

如果外键约束被破坏,DELETE 将失败; TRUNCATE 可能不遵守外键约束(它适用于 InnoDB 表)。 DELETE 将触发任何 ON DELETE 触发器; TRUNCATE 不会。

更快

截断操作删除并重新创建表,这比逐行删除要快得多,尤其是对于大型表。

在哪里使用

截断

当表设置为空时,需要将自增键重置为 1。 它比 DELETE 快,因为它会删除所有数据。 DELETE 将扫描表以生成受影响的行数。

删除

需要根据可选的 WHERE 子句删除行。 需要日志并应用外键约束

【讨论】:

    【解决方案3】:

    DELETE 命令用于从表中删除行

    TRUNCATE 删除表中的所有行。该操作无法回滚,也不会触发任何触发器。因此,TRUNCATE 速度更快,并且不像DELETE 使用那么多的撤消空间。

    【讨论】:

      【解决方案4】:

      区别:

      1. Truncate 删除表中的完整数据,下一个自动递增 id 将从 1 开始,而Delete 将从下一个 id 开始。
      2. 两者都将保持结构完整并仅删除数据。
      3. Delete 可以使用 limit,而Truncate 则不能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-26
        • 2010-12-18
        • 2013-06-28
        • 2012-08-21
        • 1970-01-01
        • 2011-03-22
        • 1970-01-01
        相关资源
        最近更新 更多