mysql三种删除方式

摘要:
通常,mysql有三种删除数据的方法:1.delete(通用)2.truncate(谨慎)3.drop。以上三种方法可以删除数据,但使用场景不同。就执行速度而言:drop>截断>>为了深入底层,DELETEDELE:1。DELETEDDELETE是属于数据库的DML操作语言。删除数据时,数据库只能删除数据,不能删除表的结构,这将触发数据库的事务机制。删除

一般来说mysql有三种删除数据方式:
1. delete(常用)
2. truncate(慎用)
3. drop
以上三种方式都可以删除数据,但是使用场景是不同的。

从执行速度来说:
drop > truncate >> DELETE

深入底层来说:
一、DELETE
mysql三种删除方式第1张
DELETE是属于数据库的DML操作语言,使用delete删除数据时,数据库只能删除数据不能删除表的结构,会触发数据库的事务机制。
DELETE执行时,会先将所删除数据缓存到rollback segement中,事务commit之后生效;
另外在mysql不同引擎下使用delete也是有一定区别的:
在InnoDB中,使用delete其实并不会真正的把数据删除,是一种逻辑删,数据库底层实际上只是给删除的数据做了一个已删除的标记,因此,删除数据后的表占空间大小和删除前是一样的,
执行delete操作的数据所占的空间,并不会被释放,只是设置了不可见。虽然未释放磁盘空间,但是这一部分的空间是依然可以重复使用的。(重用---》也是就覆盖,新数据将有标记的数据覆盖)
delete操作以后使用 optimize table table_name 会立刻释放磁盘空间。不管是InnoDB还是MyISAM 。所以要想达到释放磁盘空间的目的,delete以后执行optimize table 操作
对于带有条件的删除delete语句,执行后,在MyISAM和InnoDB下都不会释放磁盘空间,想要立刻释放空间,执行optimize table table_name即可。
查看表占磁盘大小SQL:(用M做展示单位)
SELECT
concat( round( sum( DATA_LENGTH / 1024 / 1024 ), 2 ), 'M' ) AS table_size
FROM
information_schema.TABLES
WHERE
table_schema = '库'
AND table_name = '表'
mysql三种删除方式第2张

优化表存储大小SQL: optimize table 表名
mysql三种删除方式第3张

delete 操作是一行一行执行删除的,并且同时将该行的的删除操作日志记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,生成的大量日志也会占用磁盘空间。

  二、truncate
  TRUNCATE删除sql语句:Truncate table TABLE_NAME

1、truncate:属于数据库DDL定义语言,不走事务,原数据不放到 rollback segment 中,操作不触发 trigger。(慎用删除执行后,元数据就没了,不可恢复)执行后立即生效,无法找回
2、truncate 删除表会立刻释放磁盘空间 ,不管是 InnoDB和MyISAM 。truncate table其实有点类似于drop table 然后creat,只不过这个create table 的过程做了优化,比如表结构文件之前已经有了等等。所以速度上应该是接近drop table的速度;
3、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 开始。

  三、drop
  drop删除表sql:Drop table Tablename

1、drop:属于数据库DDL定义语言,同Truncate;执行后立即生效,无法找回
2、drop table table_name 立刻释放磁盘空间 ,不管是 InnoDB 和 MyISAM; drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index); 依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。

可以这么理解,一本书,delete是把目录撕了,truncate是把书的内容撕下来烧了,drop是把书烧了

免责声明:文章转载自《mysql三种删除方式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇高性能MySQL(第3版) 中文PDF带目录清晰版firedac的TFDStoredProc动态创建并调用存储过程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql-8.0 安装教程(自定义配置文件,密码方式已修改)

下载zip安装包:   MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/downloads/file/?id=476233,进入页面后可以不登录。后点击底部“No thanks, just start my download.”即可开始下载。   或直接下载:https://dev.mysql.com...

[转]C++中的自动存储、静态存储和动态存储

根据用于分配内存的方法,C++中有3中管理数据内存的方式:自动存储、静态存储和动态存储(有时也叫做自由存储空间或堆)。在存在是间的长短方面,以这三种方式分配的数据对象各不相同。下面简要介绍这三种类型(注:C++11中新增了第四种类型——线程存储) 1.自动存储 在函数内部定义的常规变量使用自动存储空间,被称为自动变量(automatic variable)...

SQL查询速度慢的原因分析和解决方案

SQL查询速度慢的原因分析和解决方案 查询速度慢的原因很多,常见如下几种:1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)2、I/O吞吐量小,形成了瓶颈效应。3、没有创建计算列导致查询不优化。4、内存不足5、网络速度慢6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)7、锁或者死锁(这也是查询慢最常见的问题,是程序设计...

mysql导出导入sql文件方法(linux)

一、导入导出.sql文件for Linux: 1、从mysql中导出数据库test: 在终端运行:mysqldump -h localhost -u root -p test > /home/chuzj/daochu.sql 其中localhost是服务器名字 test是数据库名字,其后可以直接跟表名 2、将daochu.sql 导入到mysql数...

MySQL监控、性能分析——工具篇

转自http://blog.csdn.net/leamonjxl/article/details/6431444 MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析、监控预警、容量扩展议题越来越多。“工欲善其 事,必先利其器”,那么我们如何在进行MySQL性能分析、监控预警、容量扩展问题上得到更好的解决方案,就...

MySQL 双主 + keepalived

参考:https://www.cnblogs.com/kevingrace/p/6710136.html MySQL双主复制 + keepalived 可以实现数据高可用。双主即互为master-slave,其中任意一个改变,另外一个会跟着改变(与主从不同,主从是单向);可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换。使用Keepa...