Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试官灵魂一问: MySQL 的 delete、truncate、drop 有什么区别?

面试官灵魂一问: MySQL 的 delete、truncate、drop 有什么区别?

作者头像
java进阶架构师
发布于 2020-11-13 02:33:00
发布于 2020-11-13 02:33:00
1.1K10
代码可运行
举报
文章被收录于专栏:Java进阶架构师Java进阶架构师
运行总次数:0
代码可运行

来源:blog.csdn.net/qq_39390545/article/details/107144859

  • 一、从执行速度上来说
  • 二、从原理上讲
    • 1、DELETE
    • 2、truncate
    • 3、drop

上周同事小姐姐问我:“哥你看,我发现MySQL有bug,我下午为了清理磁盘,明明删除了100万条MySQL数据,磁盘不仅没有变小,反而更满了呢??” 那你是怎么删除的? “delete from table 呀” “怪不得,其实要删除MySQL数据是有好几种方式的,有些场景下是不应该用DELETE的,比如你这种情况。好了,让我来给你讲一下吧。”

MySQL删除数据的方式都有哪些?

咱们常用的三种删除方式:通过 delete、truncate、drop 关键字进行删除;这三种都可以用来删除数据,但场景不同。

一、从执行速度上来说

drop > truncate >> DELETE

二、从原理上讲

1、DELETE

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELETE from TABLE_NAME where xxx

1、DELETE属于数据库DML操作语言,只删除数据不删除表的结构,会走事务,执行时会触发trigger;

2、在 InnoDB 中,DELETE其实并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记为已删除,因此 delete 删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会被释放,只是把删除的数据行设置为不可见。 虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以重用这部分空间(重用 → 覆盖)。

3、 DELETE执行时,会先将所删除数据缓存到rollback segement中,事务commit之后生效;

4、 delete from table_name删除表的全部数据,对于MyISAM 会立刻释放磁盘空间,InnoDB 不会释放磁盘空间;

5、对于delete from table_name where xxx 带条件的删除, 不管是InnoDB还是MyISAM都不会释放磁盘空间;

6、 delete操作以后使用 optimize table table_name 会立刻释放磁盘空间。不管是InnoDB还是MyISAM 。所以要想达到释放磁盘空间的目的,delete以后执行optimize table 操作。

示例:查看表占用硬盘空间大小的SQL语句如下:(用M做展示单位,数据库名:csjdemo,表名:demo2)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') as table_size



   from information_schema.tables



      where table_schema='csjdemo' AND table_name='demo2';

然后执行空间优化语句,以及执行后的表Size变化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
optimize table demo2

再看看这张表的大小,就只剩下表结构size了。

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

2、truncate

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Truncate table TABLE_NAME

1、truncate:属于数据库DDL定义语言,不走事务,原数据不放到 rollback segment 中,操作不触发 trigger。

执行后立即生效,无法找回 执行后立即生效,无法找回 执行后立即生效,无法找回

2、 truncate table table_name 立刻释放磁盘空间 ,不管是 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 开始。

4、 小心使用 truncate,尤其没有备份的时候,如果误删除线上的表,记得及时联系中国民航,订票电话:400-806-9553

3、drop

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Drop table Tablename

1、drop:属于数据库DDL定义语言,同Truncate;

执行后立即生效,无法找回 执行后立即生效,无法找回 执行后立即生效,无法找回

2、 drop table table_name 立刻释放磁盘空间 ,不管是 InnoDB 和 MyISAM; drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index); 依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。

3、 小心使用 drop ,要删表跑路的兄弟,请在订票成功后在执行操作!订票电话:400-806-9553

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java进阶架构师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
这个订票电话就很骚
这个订票电话就很骚
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
delete、truncate、drop的区别有哪些,该如何选择
咱们常用的三种删除方式:通过 delete、truncate、drop 关键字进行删除;这三种都可以用来删除数据,但场景不同。
肉眼品世界
2020/11/11
4760
delete、truncate、drop的区别有哪些,该如何选择
MySQL中delete、truncate、drop用法比较
delete属于数据管理语言(DML),会执行事务,也会触发触发器,可以回滚数据,常见的命令用法如下:
素履coder
2022/09/27
2K0
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day4】 —— 数据库1
  本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL数据库、Redis缓存、RabbitMQ消息队列、Linux操作技巧等。
陈哈哈
2021/10/13
4190
MySQL中drop、delete与truncate的区别
【玩转 GPU】AI绘画、AI文本、AI翻译、GPU点亮AI想象空间-腾讯云开发者社区-腾讯云 (tencent.com)
疯狂的KK
2023/07/07
1.5K0
MySQL中drop、delete与truncate的区别
MySQL删除表数据、清空表命令(truncate、drop、delete 区别)
MySQL、Mariadb、PostgreSQL删除表数据、清空表命令 都可用以上三种命令。
寻求出路的程序媛
2024/02/21
37.1K1
【MySQL】MySQL数据库的进阶使用
1. 之前我们所学的都是DDL语句,接下来所学的才是真正的DML语句。 插入数据的sql语句就是insert into table_name (column1, column2, ……) values (data1, data2, ……),values左边的括号不加时,默认代表对表的所有列进行插入,不忽略任何一列,加上括号时,可以自己指定某些列进行插入,但值得注意的是如果某些列没有default约束,你还将其忽略进行数据插入的话,则插入数据的操作一定会失败。values右边的括号个数表示向表中插入几行的数据,括号中用逗号分隔开来的数据分别一 一对应表中的列字段。
举杯邀明月
2023/10/17
9230
【MySQL】MySQL数据库的进阶使用
oracle中delete drop truncate的用法和区别
      数据库的运维中,经常会遇到delete drop truncate的操作,那么如何去把握它们的用法和区别呢?
孙杰
2019/10/29
2.8K0
面试突击58:truncate、delete和drop的6大区别
在 MySQL 中,使用 truncate、delete 和 drop 都可以实现表删除,但它们 3 个的使用场景和执行效果完全不同,接下来我们来盘点一下。
磊哥
2022/06/30
1.5K0
面试突击58:truncate、delete和drop的6大区别
你也许连删库跑路都不会
这两年 IT 界隔三岔五的出现一次程序员删库的新闻,这种删库跑路的行为往往会给受害公司造成很大的损失,甚至会导致一个公司的破产。我们程序员看到这类新闻的时候很大一部分会把它当作一个闲聊的摊子,但是各位读者你是否想过这么一个问题:我知道怎么正确删库吗?看到这里估计有读者会感觉删库谁不会啊 Delete 以下呗。如果你这么想的话那就接着看这篇文章吧,在后面的内容中我将讲解数据库删除数据的方式以及原理。
喵叔
2020/11/04
4480
你也许连删库跑路都不会
MySQL删除数据空间没有释放-碎片
我们在做数据库运维的时候,经常会发现数据库批量删除数据之后,磁盘空间并没有立即释放或者说没有丝毫变化的场景。接下来我们就针对INNODB和MyISAM两款存储引擎分析一下。
Power
2025/03/01
3120
mysql如何正确的删除数据(drop,delete,truncate)
DROP 命令用于删除整个数据库或表。如果你想要删除整个数据库,可以使用如下命令:
一只牛博
2025/05/30
2330
【DB笔试面试476】DELETE、DROP和TRUNCATE的区别是什么?
DELETE和TRUNCATE都可以用来删除表中所有的记录。但二者的不同之处主要体现在以下几个方面的内容:
AiDBA宝典
2019/09/30
6900
MySQL数据库:drop、truncate、delete的区别
4、提交方式:delete是DML,需要手动提交操作才能生效,可以回滚,可以触发触发器;truncate和drop是DDL,会隐式提交,不能回滚,不会触发触发器。
全栈程序员站长
2022/06/29
1.4K0
mysql删除表语句_navicat不小心把表删了
删除表全部数据和表结构,立刻释放磁盘空间,不管是 Innodb 和 MyISAM;
全栈程序员站长
2022/11/01
1.2K0
delete和truncate 的区别
MySQL里面,delete和truncate都能清空表数据,保留表结构。但是这2个命令还是有些区别的。
保持热爱奔赴山海
2019/09/18
8290
delete和truncate 的区别
MySQL DDL 数据定义
在 MySQL 中,DATABASE 和 SCHEMA 在语法上是等效的,它们都用于创建数据库。在其他 RDBMS(如 Oracle 和 SQL Server)
恋喵大鲤鱼
2023/10/12
3520
MySQL 数据库和表操作
MySQL服务器中的 【数据库】 以文件夹的形式存放在data目录下,本章讲解如何优雅地使用SQL命令操作数据库和数据表。
技能锦囊
2020/04/15
6.5K0
drop、truncate和delete的区别
1、在速度上,一般来说,drop> truncate > delete。 2、在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎用。 3、如果想删除部分数据用delete,注意带上where子句,回滚段要足够大; 如果想删除表,当然用drop; 如果想保留表而将所有数据删除,如果和事务无关,用truncate即可; 如果和事务有关,或者想触发trigger,还是用delete; 如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
海盗船长
2020/08/28
6020
关于delete,drop,truncate的问题 (r6笔记第14天)
有一个很常规的问题大量出现在笔试面试中,就是delete,truncate和drop的区别,当然这个问题我们也可以升华一下,通过这个简单的问题其实可以关联到Oracle的一些特性。 我们先来看看常规的问题,常规的回答。 从网上也搜了一些答案,自己也略微做了改动。 相同点: 1.truncate和不带where子句的delete, 以及drop都会删除表内的数据。 2.drop,truncate都是DDL(数据定义语言)语句,执行后会自动提交。 不同点: 1. truncate和 delete只删除数据不
jeanron100
2018/03/16
6330
delete 后加 limit 是个好习惯么?!
在业务场景要求高的数据库中,对于单条删除和更新操作,在删除和更新后加限制1绝对是个好习惯。这样,在删除执行中,第一条就命中了删除行,如果SQL中有限制1;这时就return了,否则将会执行完全表扫描才ret urn。效率不言而喻。
芋道源码
2020/10/27
1.1K0
delete 后加 limit 是个好习惯么?!
相关推荐
delete、truncate、drop的区别有哪些,该如何选择
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验