MySQL Truncate和Delete区别

159 阅读1分钟

 总结:

① Truncate删除整个表,Delete可删除单行(where)。

② Truncate快,Delete慢。

③ Truncate不支持回滚,Delete支持回滚。

④ Delete不会释放空间。

① 条件删除

# delete - 条件删除
DELETE FROM student WHERE id = 1;
# delete - 删除整个表的数据
DELETE FROM student;
#  truncate - 删除整个表的数据
TRUNCATE TABLE student;

Delete可进行条件删除。

Truncate只能删除整个表。

② 回滚

Delete支持回滚,删除时是一行一行进行删除,需要将操作写入Undo,所以速度慢。

③ 高水位

数据库中有些表使用delete删除了一些行后,发现空间并未释放。

原因:

  • delete 不会释放文件高水位
  • truncate会释放 ,实际是把.ibd文件删掉了,再建一个。
  • delete + alter engine=innodb会释放, 相当于重建表。

解决方案:

  • **执行 OPTIMIZE TABLE 表名:**只对MyISAM, BDB和InnoDB表起作用,而且会锁表!
  • **写一SQL,创建新表,删除旧表,新表重命名:**生产环境中不停机情况下,数据比较难处理
  • 考虑用表分区,过期的表分区直接删除,不存在高水位问题,推荐。