delete 会不会锁表_truncate为什么比delete快

c7eaaa8b6a5aeb337b362d79c8ffea4e.png

在工作学习中,有时候我们可能要删除整张表的数据。大多数人可能会说,这还不容易,delete from table_name一条SQL语句,搞定!

可是,事情真的是看到的这么简单吗?

认识truncate

truncate只作用于表,主要用于删除一张表中的所有数据,其作用与不带任何条件的delete一样,且都不会破坏表结构。但是,truncate不走事务,不会锁表;不会产生日志,不写入日志文件;truncate执行完之后,立马释放磁盘空间。

truncate会清空表中的所有行,但表结构及其约束、索引不会被改变,但是会使表和索引所占用的空间会恢复到初始大小。最后一点,它还会重置表的自增值。这样的效果,让我们联想起,它是不是像是把一张表drop之后,又把表重新create了一遍?答案确实如此。

所有的这些,这就是truncate。

c4442fb81c1b0cdc404c9488153122aa.png

truncate为什么比delete快

事务性与非事务性

所有的DML语句操作都会将数据放到rollback中,事务提交后才生效,所以在事务提交之前的这段时间,会锁表,从而占用一定的磁盘空间。

而DDL语句操作后即刻生效,它是不会将数据放到rollback中的,执行完成则意味着游戏结束,不能被回滚,所以操作完成后就会释放占用的磁盘空间。

delete属于DML语句,truncate属于DDL语句。

日志记录

delete语句每次删除一行,并在事务日志中为所删除的每行记录一项。truncate通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

delete记录日志比truncate更耗时。

d75574f81da7b8a497fe8f3cfa0192ed.png

truncate的安全性

truncate表是高危操作,特别是在生产环境要更加小心。毕竟它无法通过binlog回滚,一旦执行就会清空所有数据且执行速度很快,所以执行truncate前一定要反复检查确认,最好备份下表数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值