MySQL45讲 第十三讲 为什么表数据删掉一半,表文件大小不变?

文章目录

  • MySQL45讲 第十二讲 为什么表数据删掉一半,表文件大小不变?
    • 一、引言
    • 二、InnoDB 表数据存储方式
    • 三、数据删除流程及表空间未回收原因
    • 四、重建表以回收表空间
    • 五、Online 与 inplace 概念区别
    • 六、总结

MySQL45讲 第十二讲 为什么表数据删掉一半,表文件大小不变?


一、引言

在 MySQL 数据库管理中,经常会遇到表空间占用过大的问题,而简单删除表数据却未能使表文件大小减小。本文针对 MySQL 中广泛应用的 InnoDB 引擎,深入探讨表空间回收相关问题,包括数据存储方式、删除数据流程、表空间未回收原因、重建表方法及其相关概念的区别等。


二、InnoDB 表数据存储方式

  1. 参数 innodb_file_per_table,该参数控制表数据的存储位置:
    • 当设置为 OFF 时,表数据存放在系统共享表空间,与数据字典在一起;
    • 设置为 ON 时(MySQL 5.6.6 版本起默认值为 ON,建议设置为 ON),每个 InnoDB 表数据存储在一个以.ibd 为后缀的文件中,这样便于管理,删除表时可直接删除文件回收空间,后续讨论基于此设置展开。

三、数据删除流程及表空间未回收原因

  1. 记录删除与复用

    • 当删除 InnoDB 中的记录(如删掉 R4)时,引擎仅将记录标记为删除,若后续插入符合范围条件的数据(如 ID 在 300 和 600 之间)可复用该位置,但磁盘文件大小不变。

    在这里插入图片描述

  2. 数据页删除与复用

    • 若整个数据页上的记录都被删除,该数据页可被复用,但复用方式与记录复用不同,数据页从 B + 树摘掉后可复用到任何位置。
    • delete 命令删除整个表数据时,所有数据页被标记为可复用,但磁盘文件大小仍不会变小,这些未使用空间形成 “空洞”。
  3. 插入数据造成空洞

    • 插入数据(随机插入导致索引页分裂)和更新索引值(可理解为删除旧值再插入新值)也会造成空洞,所以经过大量增删改的表可能存在空洞,这是 delete 命令不能回收表空间的原因。
    • 下图中,插入索引为550的行R6,在PageA和PageB都出现了一个空洞。

    在这里插入图片描述


四、重建表以回收表空间

  1. 重建表的原理

    • 简而言之,就是原表A有空洞,那我新建一个表B,将A的数据复制到B,空洞就跳过,这样新表B就没空洞啦。
    • 新建与原表结构相同的表,按主键 ID 递增顺序将原表数据读入新表,新表主键索引更紧凑、数据页利用率更高,用新表替换原表可达到收缩原表空间的目的,可使用 alter table A engine = InnoDB 命令重建表。
  2. MySQL 5.5 版本之前的重建表流程

    • MySQL 会自动完成转存数据、交换表名、删除旧表操作,但整个过程中表 A 不能有更新,即该 DDL 不是 Online 的。

在这里插入图片描述

  1. MySQL 5.6 版本引入的 Online DDL 流程

    • 建立临时文件,扫描表 A 主键所有数据页;用数据页中记录生成 B + 树存储到临时文件;生成临时文件时记录对 A 的操作到日志文件;临时文件生成后将日志文件操作应用到临时文件得到与表 A 逻辑相同的数据文件;用临时文件替换表 A 的数据文件。此过程允许对表 A 做增删改操作,实现了 Online DDL。虽然 alter 语句启动时需获取 MDL 写锁,但在拷贝数据前退化为读锁,既能实现 Online(MDL 读锁不阻塞增删改)又能保护自身(禁止其他线程同时做 DDL),对于大表,拷贝数据到临时表过程耗时最长,此期间可接受增删改操作,相对整个 DDL 过程锁时间短,可认为是 Online 的。但重建表操作扫描原表数据和构建临时文件,对大表消耗 IO 和 CPU 资源,线上服务需小心控制操作时间,也可使用 gh - ost 更安全地操作。
      在这里插入图片描述

五、Online 与 inplace 概念区别

  1. inplace 概念(“原地”操作)
    • 在重建表的 Online DDL 流程中,数据重建在 InnoDB 内部完成,对于server 层是 “原地” 操作,如 alter table t engine = InnoDB 隐含 ALGORITHM = inplace。但 inplace 不一定是 Online 的,如给 InnoDB 表字段加全文索引是 inplace 但会阻塞增删改操作,是非 Online 的。
  2. Online 与 inplace 关系
    • DDL 过程如果是 Online 的,就一定是 inplace 的;反过来,inplace 的 DDL 有可能不是 Online 的,如添加全文索引和空间索引截至 MySQL 8.0 属于这种情况。
  3. 与其他重建表方式的区别
    • 从 MySQL 5.6 版本开始,alter table t engine = InnoDB 默认是 Online DDL 流程;analyze table t 只是重新统计表的索引信息,加 MDL 读锁,未修改数据;optimize table t 等于 recreate + analyze。

六、总结

如果要收缩一个表,只是delete掉表里面不用的数据的话,表文件的大小是不会变的,你还要通过alter table命令重建表,才能达到表文件变小的目的。我跟你介绍了重建表的两种实现方式,Online DDL的方式是可以考虑在业务低峰期使用的,而MySQL 5.5及之前的版本,这个命令是会阻塞DML的,需要特别小心。

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

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

相关文章

2024年前三季度币安、OKX等五大交易所上币表现分析

随着加密市场竞争的加剧,头部交易所逐渐在上币策略、代币选择、交易活跃度等方面采取了不同的应对策略。Animoca Digital Research近期发布的一份报告,通过对币安、OKX、Bitget、KuCoin和Bybit五大交易所2024年前三季度的上币情况进行了详细分析。本文将…

docker镜像仓库常用命令

docker镜像仓库常用命令 docker logindocker logoutdocker pulldocker pushdocker searchdocker imagesdocker image inspectdocker tagdocker rmidocker image prune docker login 语法: docker login [options] [server] 功能:登录到一个存放docker镜像的仓库&am…

Qt聊天室项目

目录 项目要求 项目背景 技术分析 架构设计 服务器架构 模块划分 模块之间的交互 客户端架构 模块划分 模块之间交互 项目展示 项目实现 服务器 ui server.pro dialog.h dialog.cpp 客户端 ui cient.pro dialog.h dialog.cpp 打包步骤不做演示 视频演示 项目…

MATLAB实现图像恢复设计报告

设计目标及需求分析 设计目标:希望通过matlab设计一个软件来实现对CT图像的模糊再恢复的过程,是对现实中CT图像复原的一个简单仿真。 需求分析:随着网络和通信技术的发展,数字图像处理与分析技术已经在科学研究、工业生产、医疗…

Python毕业设计选题:基于django+vue的4S店客户管理系统

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 员工信息管理 个人中心 车辆信息管理 售后服务管理 售后安排管理 车辆信…

Java基础06(代码运行时的内存图)

目录 一、引入 二、Java下的内存分配 1.类信息常量池和静态常量池 2. 栈和字符串常量池 (引进)线程 3.⭐程序计数器作用⭐(程序计数器配合栈使用) 总结Java内存: (引进)驱动 三、引用传…

论文阅读-用于点云分析的自组织网络

目前存在的问题: 原始的SOM(1)训练结果与初始节点高度相关(2)样本更新规则取决于输入点的顺序3D 卷积神经网络(需要将数据转换为体素,存在分辨率损失和计算成本上涨的问题)、PointN…

数据结构之二叉树前序,中序,后序习题分析(递归图)

1.比较相同的树 二叉树不能轻易用断言,因为树一定有空 2.找结点值 3.单值二叉树 4.对称二叉树 5.前序遍历

【JavaScript】JavaScript开篇基础(4)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

运动控制 直流有刷电机

文章目录 一、简介二、组成三、特点四、电机参数4.1 额定电压4.2 额定电流4.3 额定转速4.4 额定扭矩4.5 减速比 五、工作原理5.1 左手定则5.2 工作原理 六、测速原理6.1 磁电式编码器6.2 光电式编码器 一、简介 直流有刷电机是一种内含电刷装置能将直流电转换为机械能的电机&a…

关于模拟方法建模的一份介绍

有些时候,我们无法直接收集大量数据,即对于对象的行为直接观测或重复实验可能是不行的,所以此时就需要通过模拟的技术来收集数据,然后建模。这样的一种策略就是模拟方法建模,而模拟方法建模中最常用的一种方法就是蒙特…

Java 入门

目录 Java简介 Java JDK开发环境配置 第一个Java程序 Java标识符与关键字 Java注释 Java常量 Java变量的定义和使用 Java简介 Java简介: Java是由Sun Microsystems公司于1995年推出的一门面向对象的高级程序设计语言,可以运行于多个平台,其…

CSS--两列网页布局,三列布局和多行多列布局

两列网页布局 两列网页布局实验 先将一个未运用浮动效果的网页结构写出来 <style>header{/* 给页眉设置宽高和样式 */width:1000px;height: 40px;background-color: gray;border: 3px brown solid;margin-bottom: 5px;}article{width:1000px;height: 600px;background-c…

开源与商业的碰撞TPFLOW与Gadmin低代码的商业合作

随着数字化转型的浪潮席卷全球&#xff0c;企业对于高效、灵活的软件开发需求愈发迫切。低代码开发平台应运而生&#xff0c;为企业提供了简化开发流程、缩短开发周期的解决方案。在众多低代码开发平台中&#xff0c;Gadmin企业级低代码平台、TPFLOW工作流和SFDP超级表单脱颖而…

Edge浏览器提示“无法安全下载”

Edge浏览器在下载某些文件时&#xff0c;会提示“无法安全下载”。 注意事项&#xff1a;如果确实需要下载该文件&#xff0c;首先核对网址&#xff0c;确保下载文件的安全性&#xff0c;并在下载完成后进行必要的病毒查杀。 解决方法&#xff1a; 点击右侧的3个点&#xff0…

微服务系列三:微服务核心——网关路由

目录 前言 一、登录存在的问题归纳 二、*微服务网关整体方案 三、认识微服务网关 四、网关鉴权实现 五、OpenFeign微服务间用户标识信息传递实现 六、微服务网关知识追问巩固 前言 本篇文章具体讲解微服务中网关的实现逻辑、用于解决什么样的问题。其中标题中标注* 涉…

Docker入门系列——网络

Docker 通过容器化应用程序&#xff0c;彻底改变了我们构建、分发和运行应用程序的方式。然而&#xff0c;有效使用 Docker 的一个关键方面是理解容器如何相互通信以及与外界通信。 1. 什么是 Docker 网络&#xff1f; Docker 网络允许容器相互通信以及与外部资源通信。默认情况…

2024年大厂AI大模型面试题精选与答案解析

前言 随着AI市场&#xff0c;人工智能的爆火&#xff0c;在接下来的金九银十招聘高峰期&#xff0c;各大科技巨头和国有企业将会对AGI人才的争夺展开一场大战&#xff0c;为求职市场注入了新的活力。 为了助力求职者在面试中展现最佳状态&#xff0c;深入理解行业巨头的选拔标…

Nico,从零开始干掉Appium,移动端自动化测试框架实现

开头先让我碎碎念一波~去年差不多时间发布了一篇《 UiAutomator Nico&#xff0c;一个基于纯 adb 命令实现的安卓自动化测试框》&#xff08;https://testerhome.com/topics/37042&#xff09;&#xff0c; 由于种种原因 (详见此篇帖子) 当时选择了用纯 adb 命令来实现安卓自动…

RTP和RTCP的详细介绍及其C代码示例

RTP和RTCP的详细介绍及其C代码示例 RTP和RTCP简介RTP协议详解RTCP协议详解RTP和RTCP之间的关系C代码示例RTP和RTCP简介 RTP(Real-time Transport Protocol,实时传输协议)和RTCP(Real-time Transport Control Protocol,实时传输控制协议)是流媒体传输中常用的两个协议。R…