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 打包步骤不做演示 视频演示 项目…

MySQL 高性能优化规范建议

一、数据库设计优化 1. 选择合适的数据类型 整数类型:在存储整数时,应根据实际需求选择合适的整数类型,如 TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT。例如,如果存储的整数范围较小,可以选择 TINYINT,…

MATLAB实现图像恢复设计报告

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

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

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

QML----复制指定下标的ListModel数据

我现在有一个写好的listmodel,我需要从里边抽取35个数据作为展示 头文件 #ifndef GETONEPAGESIZEMEMBERLISTMODEL_H #define GETONEPAGESIZEMEMBERLISTMODEL_H#include <QObject> #include <QAbstractListModel> #include <QDebug> #include "mylistm…

json和pb的比较

1.介绍 在数据序列化和通信领域&#xff0c;schema 指的是用于定义数据结构的模式或结构描述。它描述了数据的字段、类型、嵌套结构和约束&#xff0c;并在数据验证和解释上发挥重要作用。常见的 schema 格式包括 Protocol Buffers (proto)、JSON Schema、XML Schema 等。 Pr…

docker 启动 neo4j

docker 启动 neo4j 1. 启动2. 导入数据 1. 启动 运行下面命令启动 neo4j&#xff0c; docker run \-d \--restartalways \--publish7474:7474 --publish7687:7687 \--volume$HOME/neo4j-4.4.38/data:/data \--name neo4j-apoc-4.4.38 \-e NEO4J_dbms_allow__upgradetrue \-e …

鸿蒙HarmonyOS开发:系统服务

拨打电话 call.makeCall 跳转到拨号界面&#xff0c;并显示待拨出的号码。使用callback异步回调。 makeCall(phoneNumber: string, callback: AsyncCallback<void>): voidimport { call } from kit.TelephonyKit;import { BusinessError } from kit.BasicServicesKit;c…

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

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

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

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

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

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

【JavaScript】JavaScript开篇基础(4)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

运动控制 直流有刷电机

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

58. 最后一个单词的长度 双指针的思想

给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大 子字符串 。 示例 1&#xff1a; 输入&#xff1a;s "Hello World" 输出&#xff…

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

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

c++ 贪心算法

概念 贪心算法是一种在每一步选择中都选择当前最优解的算法策略。这种方法适用于某些特定问题&#xff0c;可以通过局部最优选择构建全局最优解。 特点 局部最优选择&#xff1a;每一步选择都选择当前看起来最优的解。无后效性&#xff1a;当前选择不会影响未来选择的可能性…

硬件常识

目录 示波器用万用表测三极管端子 示波器 示波器的夹子 鳄鱼夹接 负 钩子 接正 用万用表测三极管端子 (万用表调至二极管档/蜂鸣档) 测NPN三极管 先找到基级对应的引脚(红表笔接在基级时&#xff0c;黑表笔接在其他任一端子都有导通电压)集电结导通电压略大于发射结 (因为发…

Java 入门

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