首页 > 其他分享 >13 | 为什么表数据删掉一半,表文件大小不变?

13 | 为什么表数据删掉一半,表文件大小不变?

时间:2023-07-01 15:44:43浏览次数:39  
标签:文件大小 13 删除 删掉 复用 Online table 数据 DDL

13 | 为什么表数据删掉一半,表文件大小不变?

参数 innodb_file_per_table

表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数 innodb_file_per_table 控制的:

  • ON 表示的是,每个 InnoDB 表数据存储在一个以 .ibd 为后缀的文件中
  • OFF 表示的是,表的数据放在系统共享表空间,也就是跟数据字典放在一起

默认值为 ON。

数据删除流程

InnoDB 里的数据都是用 B+ 树的结构组织的。

当删除数据记录时,InnoDB 引擎会把对应的数据记录标记为删除,之后这个被标记为删除的位置,会被复用。

如果删除了一个数据页上的所有记录,整个数据页就会被复用。

记录的复用:只限于符合范围条件的数据。

数据页的复用:可复用到任何位置。

delete 命令其实只是把记录的位置,或者数据页标记为了“可复用”,但磁盘文件的大小是不会变的。这些可以复用的没被使用的空间,也称为 “空洞”。

空洞的原因:

  • 删除表记录,被删除的记录只是被标记删除,索引值所在的空间能被复用,但是没有真正的删除。
  • 新增表记录,如果索引的值是随机分散的,那么会造成数据页的分裂,也会造成空洞
  • 更新索引上的值,实际上是把旧值标记为删除,然后新增一个新值,旧值虽然能被复用,但是还是造成了空洞

只有把这些空洞去掉,就能达到收缩表空间的目的。而重建表,就可以达到这样的目的。

重建表

使用 alter table A engine=InnoDB 命令来重建表。

在重建表的过程中,允许对表 A 做增删改操作。即 Online DDL。

Online DDL ,重建表的流程:

1、建立一个临时文件,扫描表 A 主键的所有数据页;

2、用数据页中表 A 的记录生成 B+ 树,存储到临时文件中;

3、生成临时文件的过程中,将所有对 A 的操作记录在一个日志文件(row log)中,对应的是图中 state2 的状态;

4、临时文件生成后,将日志文件中的操作应用到临时文件,得到一个逻辑数据上与表 A 相同的数据文件,对应的就是图中 state3 的状态;

5、用临时文件替换表 A 的数据文件。

image-20230701152024763

DDL 之前是要拿 MDL 写锁的,这样还能叫 Online DDL 吗?

alter 语句在启动的时候需要获取 MDL 写锁,但是这个写锁在真正拷贝数据之前就退化成读锁了。

为什么要退化呢?为了实现 Online,MDL 读锁不会阻塞增删改操作。

那为什么不干脆直接解锁呢?为了保护自己,禁止其他线程对这个表同时做 DDL。

Online 和 inplace

Online的意义是代表在操作表时不会阻塞其增删改的过程

inplace的意义是修改表时直接操作其原表,操作在引擎层内部完成.

与之相对的是copy方式,操作方式是新建一个修改后的表,再将原表的内容一条一条的拷贝到新表上,其效率更慢

  • DDL 过程如果是 Online 的,就一定是 inplace 的;
  • 反过来未必,也就是说 inplace 的 DDL,有可能不是 Online 的。截止到 MySQL 8.0,添加全文索引(FULLTEXT index)和空间索引 (SPATIAL index) 就属于这种情况。

optimize table、analyze table 和 alter table 这三种方式重建表的区别

  • alter table 重建表,减少页空洞
  • analyze table 重新统计索引信息
  • optimize table 重建+重新统计

标签:文件大小,13,删除,删掉,复用,Online,table,数据,DDL
From: https://www.cnblogs.com/sun-yanglu/p/17519370.html

相关文章

  • 13. 罗马数字转整数
    难度简单2432罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符数值I1V5X10L50C100D500M1000例如,罗马数字 2 写做 II ,即为两个并列的1。12 ......
  • 游戏服务器被攻击怎么办?绍兴高防服务器租用203.135.102.x
    游戏服务器遭受攻击的原因可能有很多。攻击者可能会利用多种方式来入侵服务器,如通过计算机病毒、木马程序、蠕虫程序和社交工程等方式。这些攻击可以让服务器瘫痪,造成用户数据丢失、业务中断,甚至影响到公司的声誉。今天我就来和大家说原因和解决方法一、竞争对手来攻击你的服务器,让......
  • mysql5.7.13 使用笔记
    社区版下载地址:https://dev.mysql.com/downloads/mysql/ 安装:http://www.linuxidc.com/Linux/2016-04/130414.htm     (配置文件my.cnf在网页的最下面)更新yum源:tar解压失败:http://alany.blog.51cto.com/6125308/1422299###############################################......
  • 享元模式-13
    概述享元模式(FlyweightPattern)又称轻量级模式。它使用共享技术有效支持大量细粒度对象的复用。优点:大量减少内存中对象数量,相同/相似对象在内存中仅保留一份。缺点:增加系统的复杂性。classExternal{Stringexternal;External(Stringe){external=e;......
  • 闲话 Day13.5
    稍微沾点学术而且闲话不多。难得一见的,我也开始打专题了啊。放在之前大概是完全不做/找几个水题打完跑路的。可能是感觉DP/字符串这边确实啥都不会吧。能够放到专题里面的题大抵质量还是不错的。所以打一打没啥坏处。相对来说,可能打专题比打模拟赛的用处大一点(?)然而,不可否......
  • 光脚丫学LINQ(013):LINQ查询语法与方法语法
    视频演示:http://u.115.com/file/f2f1e1a2f4 通过使用C#3.0中引入的声明性查询语法,介绍性LINQ文档中的多数查询都被编写为查询表达式。但是,.NET公共语言运行时(CLR)本身并不具有查询语法的概念。因此,在编译时,查询表达式会转换为CLR确实了解的内容:方法调用。这些方法称为......
  • React - 13 Hooks组件之useEffect
    1.useEffectimportReact,{useState,useEffect}from"react";import{Button}from'antd';import'./Demo.less';/*useEffect:在函数组件中,使用生命周期函数useEffect(callback):没设置依赖+第一次渲染完毕后,执行callback,等价于componentDidMount......
  • System.Data.SqlClient.SqlException (0x80131904): Invalid object name 'Person'.
    @@abpMicrosoft.Data.SqlClient.SqlException(0x80131904):Invalidobjectname 请求接口报错:System.Data.SqlClient.SqlException(0x80131904):Invalidobjectname'Person'.无效的名称:Person数据库没有这个表,或者这个字段处理;检查数据库是否有改表或该字段......
  • 【雕爷学编程】Arduino动手做(139)---E18-D80避障传感器模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......