【MySQL】详细说下MySQL删除数据的过程是什么样的?
2024-08-24 08:46:36
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 #可以重建表
最新文章
- Tomcat报错:Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
- CentOS系统下安装配置ftp服务
- [异常解决] 初玩SAE遇到的小问题——注册&;创建项目+MyEclipse装插件直接部署+一个简单的JSP部署实现
- 部署时,出现用户代码未处理 System.Security.Cryptography.CryptographicException 错误解决方法
- 对Android项目中的文件夹进行解释
- git 冲突解决(转载)
- redis 安装注意事项
- iOS开发:创建真机调试证书
- (转)兼容主流浏览器的CSS透明代码
- Fragment 点击事件的穿透和重叠bug
- 让资源可以下载a
- javascript小练习—点击将DIV变成红色(通过for循环遍历)
- 在Linux下的找不同-打补丁
- 【CJOJ1603】【洛谷1220】关路灯
- Python中何时使用断言
- 教你如何用ps制作紫色光斑效果
- Ionic的页面堆栈与Tabs菜单相遇的问题(页面堆栈有多个)
- openstack环境搭建常用命令
- [err]default argument given for parameter 3 of '***'
- 【C++】atoi与stoi