当'truncate table'需要0次时,为什么'从表中删除'需要很长时间?

rip*_*234 16 mysql sql performance truncate

(我在MySql中试过这个)

我相信它们在语义上是等价的.为什么不识别这个微不足道的案例并加快速度呢?

Otá*_*cio 30

truncate table无法回滚,就像删除并重新创建表一样.

  • 在MySQL TRUNCATE表中没有DROP表,它删除所有记录并将SET auto_increment值设置为1 (2认同)

Dil*_*e-O 23

......只是添加一些细节.

调用DELETE语句会告诉数据库引擎生成已删除的所有记录的事务日志.如果删除错误,您可以恢复记录.

调用TRUNCATE语句是一个"全有或全无"的毯子,它删除所有没有要从中恢复的事务日志的记录.它肯定更快,但只有当您确定不需要任何要删除的记录时才应该这样做.


Per*_*ury 8

从表中删除一次删除一行中的每一行,并将记录添加到事务日志中,以便可以回滚操作.删除所花费的时间也与表上的索引数成比例,并且是否存在任何外键约束(对于innodb).

截断有效地删除表并重新创建它,并且无法在事务中执行.因此,它需要更少的操作并快速执行.截断也不使用任何删除触发器.

有关MySql更快的详细信息,请参阅MySql文档:http: //dev.mysql.com/doc/refman/5.0/en/truncate-table.html


Eri*_*ine 6

你的问题是关于MySQL的,我对MySQL作为产品几乎一无所知,但我想我会在SQL Server中添加一个TRUNCATE语句可以回滚.亲自试试吧

create table test1 (col1 int)
go
insert test1 values(3)
begin tran
truncate table test1
select * from test1
rollback tran
select * from test1
Run Code Online (Sandbox Code Playgroud)

在SQL Server中记录了TRUNCATE,它只是没有以记录DELETE的冗长方式登录.我相信它被称为最小化记录操作.实际上,数据页仍然包含数据,但它们的范围已被标记为删除.只要数据页仍然存在,您就可以回滚截断.希望这是有帮助的.如果有人在MySQL上尝试,我有兴趣知道结果.

  • 正确,有一篇很好的文章在http://weblogs.sqlteam.com/mladenp/archive/2007/10/03/SQL-Server-Why-is-TRUNCATE-TABLE-a-DDL-and-not.aspx这解释了差异 - 在SQL Server中. (3认同)