当前位置: 首页 > 科技观察

MySQL:删除操作Delete、Truncate、Drop用法对比

时间:2023-03-12 07:13:49 科技观察

今天整理一下MySQL删除操作Delete、Truncate、Drop的用法区别,以及如何合理使用。希望对大家有所帮助!1、执行速度对比Delete、Truncate、Drop关键字可以删除数据drop>truncate>delete2。2.1原理deletedelete属于数据库DML操作语言。它只是删除数据表中的记录并执行事务。扣动扳机。在InnoDB数据库引擎中,执行删除操作只会将删除的记录标记为已删除,并不会真正删除数据。它只是将删除的数据记录设置为不可见,不会释放磁盘空间。如果插入新数据,可以覆盖那部分空间。如果启用了事务,则删除操作会先将要删除的数据缓存在回滚段中,直到事务提交后才会生效。deletefromtable_namewithoutqueryconditions会删除表中的所有数据,MyISAM引擎会立即释放磁盘空间,InnoDB不会释放磁盘空间;如果有查询条件,磁盘空间不会释放,可以执行optimizetabletable_name,磁盘空间会立即释放。建议如果需要释放存储空间,可以先执行delete,再执行optimizetabletable_name语句,清理磁盘空间。--查询数据库test对应的表t_user占用的磁盘空间selectconcat(round(sum(DATA_LENGTH/1024/1024),2),'M')astable_sizefrominformation_schema.tableswheretable_schema='test'ANDtable_name='t_user';说明:deleteoperation逐行删除,同时在redo和undo表空间中记录每一行的删除操作日志,方便回滚和redo操作,所以产生了大量的操作日志也会占用磁盘空间。2.2truncatetruncate是一种数据库DDL定义语言,不受事务影响,不会触发触发器。操作执行后立即生效,删除的数据无法找回。执行truncatetabletable_name会立即释放磁盘空间,不管是InnoDB还是MyISAM。truncate可以快速清空一个表。并重置auto_increment自动增长的值。不同类型的数据存储引擎有区别,如下:MyISAM:truncate会将auto_increment(自增序列)的值重新设置为1,删除后表仍然保持auto_increment。InnoDB:truncate会将auto_increment的值重置为1,delete后表仍然保持auto_increment。但是如果删除整张表后重启MySQL,重启后auto_increment会被设置为1。解释:InnoDB表本身无法持久化auto_increment。删除表后,auto_increment还在内存中,但重启后找不到,只能从1开始。其实重启后的auto_increment会从SELECT1+MAX(ai_col)FROMt开始。使用truncate操作时,最好备份表,以免出现不可逆的情况。2.3dropdrop属于数据库DDL定义语言,同truncate。执行后立即生效,不可恢复。droptabletable_name执行成功后,MyISM和InnoDB都会立即释放磁盘空间,并删除依赖数据表的约束、触发器和索引;依赖于表/函数的存储过程将保留,但会被禁用。综上所述,工作中删除数据库一定要慎重。建议您每次删除数据时最好使用数据表的备份,这样会大大减少您删除跑路的几率。很多时候,不要太相信自己的动手能力。老虎还在打瞌睡的时候,万一你手滑了怎么办。尽可能养成良好的数据库运维习惯,这样你就不会磕磕绊绊,事业也会更加顺利。本文转载自微信公众号“IT技术分享社区”,可通过以下二维码关注。转载本文请联系IT技术分享社区公众号。个人博客站点:https://programmerblog.xyz