网站首页 > 基础教程 正文
今天小编给大家梳理一下MYSQL删除操作Delete、Truncate、Drop用法有什么区别,到底该如何合理使用,希望对大家能有帮助!
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); 依赖于该表的存储过程/函数将保留,但是会变为失效状态。
总结
在工作当中执行数据库删除的时候一定要慎重再慎重,建议每次进行数据删除的使用最好数据表的备份工作,这样就会大大减少你删除跑路的几率。很多时候不要过于相信自己的动手能力,老虎还有打盹的时候,万一手滑了呢。尽可能养成好的数据库运维习惯,这样会让自己少跌跟头,你的事业才会更加顺利。
猜你喜欢
- 2025-01-13 【词句段运用】学习“改正、增补、删除”三种修改符号(园三)
- 2025-01-13 写材料必备:常用修改符号使用大全
- 2025-01-13 四个网络命令ping、arp、tracert、route的详细用法
- 2025-01-13 Excel表格中删除行后,序号也不连续了,一个公式教你搞定
- 2025-01-13 3小时整理了25个excel函数的基本用法,掌握它,你就是公司的表哥
- 2025-01-13 PS学习——钢笔的用法,设计师一定要掌握的工具
- 2025-01-13 ping、arp、tracert、route这四大命令的详细用法,弄懂立马成大神
- 2025-01-13 去重函数Unique,你真的会用吗?只有你想不到,没有它做不到
- 2025-01-13 面试突击55:delete、drop、truncate有什么区别?
- 2025-01-13 网络常见的 9 大命令,非常实用
- 01-14手机帝国存档怎么修改 存档简单修改教程
- 01-14文档在线预览(四) 总结篇
- 01-14MySQL数据库表碎片收集整理那些事
- 01-14刘心向学(8)指针数组的应用
- 01-14C#控件美化之路(11):控件ListBox增加DataTable数据绑定功能
- 01-14一文看懂MySQL如何判断InnoDB表是独立表空间还是共享表空间
- 01-14SpringBoot实现MySQL数据库自动备份管理系统
- 01-14一键生成数据库文档,从此告别人工整理文档
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)