【MySQL】详细说下MySQL删除数据的过程是什么样的?
drop table
- 这里先介绍一下【InnoDB】存储表空间概念:
Innodb存储引擎,可将所有的数据库数据存放于【ibdata1】的共享表空间;也可以将每张表存放于独立的.idb文件的独立表空间
(共享表空间和独立表空间都是针对数据的存储方式而言的。)
》共享表空间:某一个数据库的所有表数据都存放在一个文件中,默认这个共享表空间的文件路径在data目录下。 默认的文件名【ibdata1】,初始化为10M。 》独立表空间:每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个【.frm】表描述文件,还有一个【.ibd】文件。 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。
- 在【mysql】配置文件中有一个参数【innodb_file_per_table】,可以用来控制【innodb】对于表数据的存储规则。
》设置为ON:表示为每个innodb的表数据存在一个单独的【.idb】文件中。
在【drop table】的时候系统就会直接删除【.idb】文件,系统磁盘空间自然就释放了。 》设置为OFF:表示为所有表数据存放在系统共享表空间中,也就是跟数据字典放在一起。
- 共享表空间和独立表空间的优缺点比较:
- 共享表空间
优点:可以将表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小限制,如一个表可以分布在不同的文件上)。数据和文件在一起方便管理
缺点:对于统计分析、日志系统这类应用不适合用共享表空间,因为多个表及索引在表空间混合,大量删除操作后会造成大量空间间隙。
- 独立表空间
优点:
1》每个表都有自己的独立空间
2》每个表的数据和索引都存在自己的独立空间
3》可以实现表在不同的数据库中移动
4》空间可以回收:
a.【drop table】可以自动回收表空间
b.删除大量数据后,可通过指令【alter table [tablename] engine=innodb】重建表,来回缩空间
c.对于【innodb-plugin 的 innodb】,使用指令【turncate table】也会使空间收缩
d.独立空间表的使用,表空间的随便不会太影响全局性能,也方便处理
- 现在我们可以说说【drop table】方式删除数据:
drop table #操作会删除所有表数据以及结构
delete table
- 数据的删除流程:
1》MySQL在删除一条记录的时候,只是把这行记录标记为删除,但不会回收磁盘空间,被标记删除的位置可以被复用;
2》所以说【delete】命令只是把记录的位置或者数据页标记为【可复用】,但磁盘大小不会改变。这些可复用而没有使用的空间,看起来像个【空洞】。
- 所以此时可能会出现表空间不释放的问题
不止删除会造成数据空洞,插入数据也会,如果数据是随机插入的,就可能会造成索引的数据页分裂。

上图是一个分裂前的B+Tree,此时B+Tree分裂后:

- 重建表可以解决存在很多【空洞】的问题,从而收缩空间
alter table A engine = InnnDB #可以重建表
【MySQL】详细说下MySQL删除数据的过程是什么样的?的更多相关文章
- mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
mysql 控制台环境下查询中文数据乱码,插入.更新中文数据不成功 登录mysql密码是加入编码参数--default-character-set,中文用gbk mysql -uroo ...
- 【MySQL】Linux下MySQL 5.5、5.6和5.7的RPM、二进制和源码安装
[MySQL]Linux下MySQL 5.5.5.6和5.7的RPM.二进制和源码安装 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后, ...
- MySQL插入,更新,删除数据
插入 单行插入 1.insert into 表名 values(col1_value,col2_value,...); 每个列必须提供一个值,如果没有值,要提供NULL值 每个列必须与它在表中定义的次 ...
- (笔记)Mysql命令drop table:删除数据表
drop table命令用于删除数据表. drop table命令格式:drop table <表名>; 例如,删除表名为 MyClass 的表: mysql> drop ta ...
- mysql——插入、更新、删除数据(概念)
一.插入数据 1.为表的所有字段插入数据 -------------------------------------------------------------------------- (1)i ...
- MySQL插入、更新、删除数据
1.插入数据:由于下表的id会自增,故赋值null. 注意:字符串用' '单引号,不能双引号,英文状态下. 可以写上部分属性名进行插入操作,如bookTypeId没写,默认NULL. 也可以写上所 ...
- 【MySQL】Linux下mysql安装全过程——小白入门篇(含有问题详解)
本次安装操作在申请的腾讯云上实现(版本:CentOS Linux release 7.4.1708 (Core) ). 根据教程实现(中途各种挖坑,填坑...),地址:http://www.runoo ...
- MySQL<添加、更新与删除数据>
添加.更新与删除数据 添加数据 为表中所有字段添加数据 INSERT INTO 表名(字段名1,字段名2,……) VALUES(值1,值2,……); insert into 表名 values(值1, ...
- mysql——插入、更新、删除数据(示例)
插入数据 一.前提,新建表: ), sname ), sage ), ssex ) ); select * from student; 二.多种方式插入数据: ','zhaolei','1990-01 ...
随机推荐
- Linux系统管理第六次作业 进程和计划任务管理
1.通过ps命令的两种选项形式查看进程信息 [root@localhost ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STA ...
- python自动化测试开发利器ulipad最佳实践(可写python测试代码也可编写selenium、Appium等)...
介绍 UliPad是一个国人开发的python轻量级编辑器,导向和灵活的编程器.它如类浏览器,代码自动完成许多功能,如:HTML查看器,目录浏览器,向导等. 下载与安装 下载地址:https://py ...
- 在 AutoLayout 和 Masonry 中使用动画
动画是 iOS 中非常重要的一部分,它给用户展现出应用灵气的一面. 在动画块中修改 Frame 在原来使用 frame 布局时,在 UIView 的 animate block 中对 view 的布局 ...
- DFS--POJ 1190 生日蛋糕
Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri ...
- Entity framework 加载多层相关实体数据
Entity framework有3种加载数据的方式:懒汉式(Lazy loading),饿汉式(Eager loading),显示加载(Explicit loading).3种加载方式有各自的优缺点 ...
- 将A页面提交的数据id传递到B页面
A页面 在A页面跳转到B页面的时候,在url后面可以拼接参数 例如: window.location.href = './B.html?' + id; 跳转到B页面之后,可以通过url地址获取到从A页 ...
- 微软2016校园招聘在线笔试之Magic Box
题目1 : Magic Box 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 The circus clown Sunny has a magic box. When ...
- springboot之异常处理
我在使用springboot的时候,运行主类结果报错 : 异常错误:java.sql.SQLException: The server time zone value '?й???????' is u ...
- 教你配置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了
一:背景 1. 讲故事 前几天公众号里有位兄弟看了几篇文章之后,也准备用windbg试试看,结果这一配就花了好几天,(づ╥﹏╥)づ,我想也有很多跃跃欲试的朋友在配置的时候肯定会遇到这样和那样的问题,所 ...
- 安卓集成Unity开发示例(一)
本项目目的是在移动端的 Native App 中以库的形式集成已经写好的 Unity 工程,利用 Unity 游戏引擎便捷的开发手段进行跨平台开发. Unity官方文档 Unity as a Libr ...