MySQL删除数据 文件大小不变的原因以及处理空洞问题

数据删除流程

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

 假设,我们要删掉 R4 这个记录,InnoDB 引擎只会把 R4 这个记录标记为删除。如果之后要再插入一个 ID 在 300 和 600 之间的记录时,可能会复用这个位置。但是,磁盘文件的大小并不会缩小。InnoDB 的数据是按页存储的,删掉了一个数据页上的所有记录,整个数据页就可以被复用了。

记录的复用,只限于符合范围条件的数据。比如上面的这个例子,R4 这条记录被删除后,如果插入一个 ID 是 400 的行,可以直接复用这个空间。但如果插入的是一个 ID 是 800 的行,就不能复用这个位置了。而当整个页从 B+ 树里面摘掉以后,可以复用到任何位置。如果将数据页 page A 上的所有记录删除以后,page A 会被标记为可复用。这时候如果要插入一条 ID=50 的记录需要使用新页的时候,page A 是可以被复用的。如果相邻的两个数据页利用率都很小,系统就会把这两个页上的数据合到其中一个页上,另外一个数据页就被标记为可复用。

通过 delete 命令是不能回收表空间的。这些可以复用,而没有被使用的空间,看起来就像是“空洞”。

经过大量增删改的表,都是可能是存在空洞的。所以,如果能够把这些空洞去掉,就能达到收缩表空间的目的。而重建表,就可以达到这样的目的。而重建表,就可以达到这样的目的。

重建表

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

Online DDL 重建表的流程:

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

 

 推荐阅读

一条 SQL 更新语句如何执行的

MySQL 事务的原理以及长事务的预防和处置

InnoDB索引优化

一条 sql 语句可能导致的表锁和行锁以及死锁检测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/538937.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯(1):python排序

1 基础 1.1 输出 1.1.1 去掉输出的空格 print("Hello","World",123,sep"") print("hello",world,123,sep) print(hello,world,123) #输出结果 #HelloWorld123 #helloworld123 #hello world 123 1.1.2 以不同的方式结尾 print(&quo…

配置阿里云加速器

国内镜像中心常用阿里云或者网易云。在本地docker中指定要使用国内加速器的地址后&#xff0c;就可以直接从阿里云镜像中心下载镜像。 2024阿里云-上云采购季-阿里云 [rootlocalhost /]# mkdir -p /etc/docker [rootlocalhost /]# tee /etc/docker/daemon.json <<-EOF &…

使用电脑的时候最怕有英文?微信的这个功能一定要用起来!

相信各位小伙伴对微信都不陌生。我们平常使用微信的大部分时间都是聊天、朋友圈、视频号等。 如果有人给你发来一张全英文图片的截图&#xff0c;你会咋整&#xff1f; 请人翻译&#xff1f;这个显然不需要。 一个个字母手打上去&#xff1f;这字数少了还行&#xff0c;但多了…

【MIT 6.S081】2020, 实验记录(8),Lab: locks

目录 Task 1&#xff1a;Memory allocator (moderate)</font>Task 2&#xff1a;Buffer cache (hard)</font> Task 1&#xff1a;Memory allocator (moderate) 这个任务就是练习将一把大锁拆分为多个小锁&#xff0c;同时可以更加深入地理解 memory allocator 运行…

闲鱼月入过万的不密心法

大家好&#xff0c;我是周萝卜 再介绍一下我自己 【我叫】周萝卜 【坐标】江苏南京 【个人标签】互联网深度玩家/技术公众号运行者/个人成长/闲鱼知乎运营 【个人事件】 公众号累计4万粉丝&#xff0c;累计变现6位数 个人分享号&#xff1a;#公众号&#xff1a;萝卜的个…

docker小白第十二天

docker小白第十二天 docker network简介 docker不启动时默认的网络情况。 # 停止docker服务 systemctl stop docker.socket systemctl stop docker # 查看docker镜像 docker images输入查看docker镜像命令后&#xff0c;显示未连接到docker服务器 docker启动时网络情况 sy…

【ArcGIS 脚本工具】修改多个布局的同一文本元素

规划编制的战线有多长&#xff0c;估计各位规划人已经深有体会了。 以村规为例&#xff0c;不服务个两年别想跑哈。其他规划编制时间更长&#xff0c;以至于图纸右下角的年月也是改了又改。 本着分散改不如统一改&#xff0c;手动改不如自动改的原则&#xff0c;小编制作了这个…

谷歌Gemma大模型本地部署以及线上访问流程

1.谷歌开发出强大的 AI 模型 Gemma&#xff0c;该模型可以在笔记本电脑和台式机上运行&#xff0c;这真是太棒了&#xff01;开源的 Gemma 模型将使研究人员和开发人员能够更轻松地访问和利用其功能&#xff0c;从而为人工智能领域带来更多创新。【【【【本地安装】】】 下载安…

软件设计师16--段页式存储

软件设计师16--段页式存储 考点1&#xff1a;页式存储存储管理 - 页式存储组织存储管理 - 页面置换算法例题&#xff1a; 考点2&#xff1a;段式存储存储管理 - 段式存储组织例题&#xff1a; 考点1&#xff1a;页式存储 存储管理 - 页式存储组织 页式存储&#xff1a;将程序…

第二十三天-数据分析入门实战

目录 1.常用的数据获取网站 2.分析电信用户流失率 字段说明 1.读取数据 2.数据分析describe 3.数据验证 4.分析目的 1.整体流失情况&#xff1a;人数、比例、流失率 2.性别&#xff1a;人数、比例、流失率 3.老人&#xff1a;人数、比例、流失率 4.是否有配偶&#x…

【PHP+代码审计】PHP基础——浮点型和布尔型

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

PTA L2-012 关于堆的判断

将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种&#xff1a; x is the root&#xff1a;x是根结点&#xff1b;x and y are siblings&#xff1a;x和y是兄弟结点&#xff1b;x is the parent of y&#xff1a;x是y的父结点…