《MySQL实战45讲》13 | 为什么表数据删掉一半,表文件大小不变?

表数据存储位置

参数 innodb_file_per_table控制了表数据的存储位置:

  • 设置为OFF时,表数据存放在系统的共享表空间,也就是和数据字典放在一起;不建议存放在共享表空间,即使表删除了,空间也不会被回收;
  • 设置为ON(MySQL 5.6.6开始,默认为ON)时,表数据存放在以.idb为后缀的文件中。存储在文件中更容易管理,通过drop table就可以删除表,且系统会直接删除该文件。

数据删除流程

  • 记录的复用:适用于符合范围条件的数据。如表中存储着id为300、500、600的记录,删除id=500的记录后,此时该记录的空间被标记为可复用,再插入一条id=400的数据时,就会直接服用该空间;
  • 数据页的复用:某数据页的所有数据被删之后,该数据页就会被标记为可复用,之后插入的新数据都可复用该数据页。

故通过delete命令将表的所有数据删除后,只是将数据页都标记为可复用,磁盘上的文件大小不变,即delete不能回收表空间。

重建表

通过重建表,回收表空间。引入Online DDL后,重建表的流程:

  • 建立一个临时文件,扫描表 A 主键的所有数据页;
  • 用数据页中表 A 的记录生成 B+ 树,存储到临时文件中;
  • 生成临时文件的过程中,将所有对 A 的操作记录在一个日志文件(row log)中,对应的是图中 state2 的状态;
  • 临时文件生成后,将日志文件中的操作应用到临时文件,得到一个逻辑数据上与表 A 相同的数据文件,对应的就是图中 state3 的状态;
  • 用临时文件替换表 A 的数据文件。
    在这里插入图片描述

本文为《MySQL实战45讲》学习笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值