MySQL 中 DELETE、DROP 和 TRUNCATE 的区别是什么?

Sherwin.Wei Lv7

MySQL 中 DELETE、DROP 和 TRUNCATE 的区别是什么?

回答重点

  1. Delete 用于删除行数据,但保留表结构和相关的对象。
  2. Drop 用于完全删除数据库表,包括数据和结构。
  3. Truncate 只删除数据,不会删除表结构和索引等其他结构。

从性能来看,Drop > Truncate > Delete

扩展知识

Delete

本质上这个删除其实就是给数据行打个标记,并不实时删除,因此 delete 之后,空间的大小不会变化。

而且 delete 操作会生成 binlog、redolog 和 undolog,所以如果删除全表使用 delete 的话,性能会比较差! 但是它可以回滚。

Drop

在 InnoDB 中,每张表数据内容和索引都存储在一个以 .ibd 后缀的文件中,drop 就是直接把这个文件给删除了!还有一个 .frm 后缀的文件也会被删除,这个文件包含表的元数据和结构定义。

文件都删了,所以这个操作无法回滚,表空间会被回收,但是如果表存在系统共享表空间,则不会回收空间。

默认创建的表会有独立表空间,把 innodb_file_per_table 的值改为 OFF 后,就会被放到共享表空间中,即统一的 ibdata1 文件中。

Truncate

Truncate 会对整张表的数据进行删除,且不会记录回滚等日志,所以它无法被回滚。

并且主键字段是自增的,使用 Truncate 删除后自增重新从 1 开始。

Comments
On this page
MySQL 中 DELETE、DROP 和 TRUNCATE 的区别是什么?