为什么表数据删掉一半,表文件大小不变?
数据 为什么 文件大小 一半 不变 删掉
2023-09-27 14:26:44 时间
表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数 innodb_file_per_table 控制的:
1. 这个参数设置为 OFF 表示的是,表的数据放在系统共享表空间,也就是跟数据字典放 在一起;
2. 这个参数设置为 ON 表示的是,每个 InnoDB 表数据存储在一个以 .ibd 为后缀的文件 中。
从 MySQL 5.6.6 版本开始,它的默认值就是 ON 了。
我建议你不论使用 MySQL 的哪个版本,都将这个值设置为 ON。因为,一个表单独存储 为一个文件更容易管理,而且在你不需要这个表的时候,通过 drop table 命令,系统就会 直接删除这个文件。而如果是放在共享表空间中,即使表删掉了,空间也是不会回收的。
所以,将 innodb_file_per_table 设置为 ON,是推荐做法,我们接下来的讨论都是基于 这个设置展开的。
我们在删除整个表的时候,可以使用 drop table 命令回收表空间。但是,我们遇到的更多 的删除数据的场景是删除某些行,这时就遇到了我们文章开头的问题:表中的数据被删除 了,但是表空间却没有被回收。
delete 命令其实只是把记录的位置,或者数据页标记为了“可复用”,但 磁盘文件的大小是不会变的。也就是说,通过 delete 命令是不能回收表空间的。这些可 以复用,而没有被使用的空间,看起来就像是“空洞”。
实际上,不止是删除数据会造成空洞,插入数据也会。 如果数据是按照索引递增顺序插入的,那么索引是紧凑的。但如果数据是随机插入的,就可能造成索引的数据页分裂。
另外,更新索引上的值,可以理解为删除一个旧的值,再插入一个新值。不难理解,这也 是会造成空洞的。
也就是说,经过大量增删改的表,都是可能是存在空洞的。所以,如果能够把这些空洞去 掉,就能达到收缩表空间的目的。
而重建表,就可以达到这样的目的。
相关文章
- 为什么要用三维数据可视化?
- 大数据-消息队列-Kafka(四):Kafka命令行操作【Topic(主题)、Producer(生产者)、Consumer(消费者)】
- 为什么要进行现代数据集成?核心驱动程序和特性
- 使用Wireshark捕捉USB通信数据
- 面试官:如何在千万级数据中查询 10W 的数据,都有什么方案?
- 面试官问:MySQL 删除表数据,磁盘空间还一直被占用,为什么?
- 为什么要学习Python爬虫与数据可视化?
- 大数据助力运营商创新转型 中国信息通信大数据大会圆满召开
- 计算机网络学习笔记:第三章.数据链路层
- 第四届中国通信行业数据中心与大数据峰会成功召开
- 被窃取的LinkedIn数据被用于钓鱼邮件攻击
- Struts2_day03--从值栈获取数据_EL表达式获取值栈数据(为什么)
- 为什么MySQL不建议delete删除数据
- 数字化时代,企业为什么需要进行数据资产管理?
- C# 提前异步加载数据
- 大数据Spark “蘑菇云”行动前传第22课:Scala集合和高级函数操作实战及Spark源码鉴赏.
- android 数据存储<一>----android短信发送器之文件的读写(手机+SD卡)
- 数据集市层——论为什么随着技术分析的深入,决策数据报表问题越来越多
- 计算机网络第三章 数据链路层
- 客快物流大数据项目(一百零四):为什么选择Elastic Search作为存储服务