首页 > 数据库 >MYSQL笔记:删除操作Delete、Truncate、Drop用法比较

MYSQL笔记:删除操作Delete、Truncate、Drop用法比较

时间:2023-07-03 21:33:05浏览次数:41  
标签:Truncate 删除 auto Drop 磁盘空间 increment MYSQL table delete

1、执行速度比较

Delete、Truncate、Drop关键字都可以删除数据

drop>truncate>delete

2、原理方面

2.1 delete

delete属于数据库DML操作语言,只会删除数据表中的记录,会执行事务,执行的时候也会触发触发器。

InnoDB数据库引擎中,执行delete操作只会给删除的记录打上了删除标记,并不会真正删除数据,只是把删除的数据记录设置为不可见,不会释放磁盘空间,如果插入新的数据可以覆盖该部分空间。

如果开启事务的话,执行delete操作,会先将要删除数据缓存到rollback segement中,等事务commit之后才生效。

delete from table_name 不带查询条件会删除表的全部数据,MyISAM引擎会立刻释放磁盘空间,InnoDB 不会释放磁盘空间;如果带查询条件的话都不会释放磁盘空间,可以执行optimize table table_name 会立刻释放磁盘空间。建议如果需要释放存储空间的话可以执行delete后,然后执行optimize table table_name 语句达到清理磁盘空间的目的。


-- 查询数据库test对应的表t_user 占用的磁盘空间
select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') as table_size 
from information_schema.tables 
where table_schema='test' AND table_name='t_user';


说明:delete 操作是逐行执行删除的,并且同时将每行的的删除操作日志记录在redo和undo表空间中去,便于进行回滚(rollback)和重做操作,因此生成的大量操作日志也会占用磁盘空间。

2.2 truncate

truncate是数据库DDL定义语言,不受事务影响,也不会触发 trigger。执行操作后会立即生效,无法找回删除的数据。

执行truncate table table_name 会立刻释放磁盘空间 ,不管是 InnoDB和MyISAM 都一样 。

truncate可以退快速清空一个表。并且重置auto_increment自动增长的值。针对不同类型的数据存储引擎是有区别的,具体如下:

MyISAM:truncate会重置auto_increment(自增序列)的值为1。而delete后表仍然保持auto_increment。

InnoDB:truncate会重置auto_increment的值为1。delete后表仍然保持auto_increment。但是在做delete整个表之后重启MySQL的话,则重启后的auto_increment会被置为1。

说明:InnoDB的表本身是无法持久保存auto_increment。delete表之后auto_increment仍然保存在内存,但是重启后就找不到了,只能从1开始。实际上重启后的auto_increment会从 SELECT 1+MAX(ai_col) FROM t 开始。

使用truncate操作的时候要最好备份表,避免出现不可挽回的情况。

2.3 drop

drop属于数据库DDL定义语言,和truncate一样。执行后会立即生效,不可恢复。

drop table table_name 执行成功后不管是MyISM还是InnoDB都会立刻释放磁盘空间 ,并且会删除该数据表上依赖的约束(constrain)、触发器(trigger)、索引(index); 依赖于该表的存储过程/函数将保留,但是会变为失效状态。

总结

在工作当中执行数据库删除的时候一定要慎重再慎重,建议每次进行数据删除的使用最好数据表的备份工作,这样就会大大减少你删除跑路的几率。很多时候不要过于相信自己的动手能力,老虎还有打盹的时候,万一手滑了呢。尽可能养成好的数据库运维习惯,这样会让自己少跌跟头,你的事业才会更加顺利

标签:Truncate,删除,auto,Drop,磁盘空间,increment,MYSQL,table,delete
From: https://blog.51cto.com/u_16173732/6615814

相关文章

  • mysql处理delete后不释放磁盘空间
    myisam:optimizetabletable_nameinnodb:altertabletable.nameengine='innodb’1.问题描述在使用mysql的时候有时候,可能会发现尽管一张表删除了许多数据,但是这张表表的数据文件和索引文件却奇怪的没有变小。这是因为mysql在删除数据(特别是有Text和BLOB)的时候,会留下许多的数......
  • Bat批处理命令实现一键安装mysql环境
    已测试可用的版本MySQL8.0;环境:windows7/10MySQL8.0.15免安装版项目需求需要实现一个自动化MySQL配置安装及初始化数据库(初始化包括:设置用户名和密码)。批处理用来对某对象进行批量的处理,即可通过批处理让相应的软件执行自动化操作。MySQL免安装版使用步骤:1.配置环境变量2.创建MySQ......
  • mysql的update更新及delete删表记录where不带索引字段导致死锁
    为什么会发生这种的事故?InnoDB存储引擎的默认事务隔离级别是「可重复读」,但是在这个隔离级别下,在多个事务并发的时候,会出现幻读的问题,所谓的幻读是指在同一事务下,连续执行两次同样的查询语句,第二次的查询语句可能会返回之前不存在的行。因此InnoDB存储引擎自己实现了行锁,通过......
  • python连接Oracle数据库实现数据查询并导入MySQL数据库
    1.项目背景由于项目需要连接第三方Oracle数据库,并从第三方Oracle数据库中查询出数据并且显示,而第三方的Oracle数据库是Oracle11的数据库。而django4.1框架支持支持Oracle数据库服务器19c及以上版本,需要7.0或更高版本的cx_OraclePython驱动;django3.2支持Oracle数据库......
  • mysql拓展
    事务定义就是将一组SQL语句放在同一批次内去执行如果一个sql语句出错,则改批次内的所有sql都将被取消执行 (1)原子性 一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性 (2)一致性 在事务开始之前和事务结束以后,数据库的完整性没......
  • mysql查看表容量大小
    1.查看所有数据库容量大小selecttable_schemaas'数据库',sum(table_rows)as'记录数',sum(truncate(data_length/1024/1024,2))as'数据容量(MB)',sum(truncate(index_length/1024/1024,2))as'索引容量(MB)'frominformation_schema.tablesgr......
  • MYSQL数据库转DM达梦数据库函数替换及注意事项
    1、调整IF函数为 case 函数MYSQL: IF(condition, value_if_true, value_if_false) if(a.class_sort_code='0301',(selectgroup_concat(sku_attr_id)sku_Attrfroma_sku_attr_relaWHEREmodel_id=a.model_idorderbysku_attr_id),'')sku_attrD......
  • mysql 配置主从复制
    推荐编译安装,但是太麻烦了,所以直接docker安装。参考https://blog.csdn.net/abcde123_123/article/details/106244181https://www.cnblogs.com/songwenjie/p/9371422.html拉取镜像推荐使用mysql5.7dockerpullmysql:5.7.39启动两个服务https://zhuanlan.zhihu.com/......
  • MySQL数据迁移
    前言在进行迁移时,源mysql的配置和目标mysql的配置应尽量保持一致迁移所有数据库迁移前,源端有以下数据库:迁移前,目标端有以下数据库目标端是刚安装好的mysql,默认就有上图中的4个库,源端比目标端多了一个dan库在源端备份所有数据库[root@target_pcdatabasefile]# mysql......
  • Mysql基础篇(四)之事务
    一.事务简介事务是一组操作的集合,它是一个不可分隔的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。就比如:张三给李四转账1000块钱,张三银行账户的钱减少了1000,而李四银行账户的钱要增加1000。这一组操作就必须在一......