在工作学习中,有时候我们可能要删除整张表的数据。大多数人可能会说,这还不容易,delete from table_name一条SQL语句,搞定!
可是,事情真的是看到的这么简单吗?
认识truncate
truncate只作用于表,主要用于删除一张表中的所有数据,其作用与不带任何条件的delete一样,且都不会破坏表结构。但是,truncate不走事务,不会锁表;不会产生日志,不写入日志文件;truncate执行完之后,立马释放磁盘空间。
truncate会清空表中的所有行,但表结构及其约束、索引不会被改变,但是会使表和索引所占用的空间会恢复到初始大小。最后一点,它还会重置表的自增值。这样的效果,让我们联想起,它是不是像是把一张表drop之后,又把表重新create了一遍?答案确实如此。
所有的这些,这就是truncate。
truncate为什么比delete快
事务性与非事务性
所有的DML语句操作都会将数据放到rollback中,事务提交后才生效,所以在事务提交之前的这段时间,会锁表,从而占用一定的磁盘空间。
而DDL语句操作后即刻生效,它是不会将数据放到rollback中的,执行完成则意味着游戏结束,不能被回滚,所以操作完成后就会释放占用的磁盘空间。
delete属于DML语句,truncate属于DDL语句。
日志记录
delete语句每次删除一行,并在事务日志中为所删除的每行记录一项。truncate通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
delete记录日志比truncate更耗时。
truncate的安全性
truncate表是高危操作,特别是在生产环境要更加小心。毕竟它无法通过binlog回滚,一旦执行就会清空所有数据且执行速度很快,所以执行truncate前一定要反复检查确认,最好备份下表数据。