iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL分库分表后总存储变大了的原因是什么
  • 365
分享到

MySQL分库分表后总存储变大了的原因是什么

2024-04-02 19:04:59 365人浏览 薄情痞子
摘要

本篇内容介绍了“Mysql分库分表后总存储变大了的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

本篇内容介绍了“Mysql分库分表后总存储变大了的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

 1.背景
在完成一个分表项目后,发现分表的数据迁移后,新库所需的存储容量远大于原本两张表的大小。在做了一番查询了解后,完成了优化

回过头来,需要进一步了解下为什么会出现这样的情况。

与标题的问题的类似问题还有,为什么表数据内容删除了而表大小没有变化。其本质都是一样的。

要回答这些问题,我们需要从mysql索引模型谈起。

2.InnoDB 的索引模型
在 Mysql 中,索引是在存储引擎层实现的,所以并没有统一的索引标准,即不同存储引擎的索引的工作方式并不一样。

而即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。由于 InnoDB 存储引擎在 MySQL 数据库中使用最为广泛,所以接下来就以 InnoDB 为例,分析其中的索引模型。

在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。而InnoDB中,使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的,每一个索引会对应一颗B+树。

假设,我们有一个主键列为 ID 的表,表中有字段 k,并且在 k 上有索引,建表语句如下

  • CREATE TABLE `t` (

  • `id` int(11) NOT NULL,

  • `k` int(11) NOT NULL,

  • `name` varchar(16) DEFAULT NULL,

  • PRIMARY KEY (`id`),

  • KEY `k` (`k`)

  • ) ENGINE=InnoDB DEFAULT CHARSET=utf8

MySQL分库分表后总存储变大了的原因是什么

表中 R1~R5 的 (ID,k) 值分别为 (10,1)、(20,2)、(30,3)、(50,5) 和 (70,7),索引id和索引k的B+树的示例示意图如下。

根据叶子节点的内容,索引类型分为主键索引和非主键索引,主键索引的叶子节点存的是整行数据R1~R5,非主键索引的叶子节点内容是主键的值。

从图中可以看出,基于非主键索引的查询需要多扫描一棵索引树才能找到对应的数据。提一句题外话,我们在应用中应该尽量使用主键查询。

3.索引维护
B+ 树为了维护索引有序性,在增删改数据的时候需要做必要的维护。

假设,我们要删掉 R4 这个记录,InnoDB 引擎只会把 R4 这个记录标记为删除。如果之后要再插入一个 ID 在 300 和 600 之间的记录时,可能会复用这个位置。

如果删掉了一个数据页上的所有记录,那么整个数据页就能被复用了。进一步地,如果我们用 delete 命令把整个表的数据删除呢?结果就是,这个表相关的所有的数据页都会被标记为可复用。

但是,无论如何,磁盘文件的大小并不会缩小。

这些被标记为可复用,而并没有实际被使用的空间,就是一些“存储空洞”。

MySQL分库分表后总存储变大了的原因是什么

实际上,不止是删除数据会造成空洞,插入数据也会。

以上图为例,如果插入新的行 ID 值为 80,则只需要在 R5 的记录后面插入一个新记录。

如果新插入的 ID 值为 60,就相对麻烦了,需要逻辑上挪动后面的数据,空出位置。

而更糟的情况是,如果 R5 所在的数据页已经满了,根据 B+ 树的算法,这时候需要申请一个新的数据页,然后挪动部分数据过去。这个过程称为页分裂。在这种情况下,性能自然会受影响。

除了性能外,页分裂操作还影响数据页的利用率。原本放在一个页的数据,现在分到两个页中,插入一条记录竟然使得整体空间利用率降低大约 50%。

可以看到,由于 page 2 满了,再插入一个 ID 是 60 的数据时,就不得不再申请一个新的页面 page 3 来保存数据了。

页分裂完成后,page 2 的末尾就留下了空洞(注意:实际上,可能不止 1 个记录的位置是空洞)。

另外,更新索引上的值,可以理解为删除一个旧的值,再插入一个新值。不难理解,这也是会造成空洞的。

因此,大量的增删改之后的表,都是可能存在很大的“数据空洞”的。

因此,我们就能解释,为什么分表后的总存储变大了。

因为分表后,需要从老库全量同步数据到新库,数据同步平台开启多个线程进行同步,插入各个分表并不是按照递增的顺序插入的,因此,会产生巨量的“数据空洞”,造成存储空间变大。

如果能够把这些空洞去掉,就能达到收缩表空间的目的。而重建表就能达到这样的目的。

4.重建表
如果我们手动重建一张表,可以新建一个与表 A 结构相同的表 B,然后按照主键 ID 递增的顺序,把数据一行一行地(就是递增地)从表 A 里读出来再插入到表 B 中。由于表 B 是新建的表,所以表 A 主键索引上的空洞,在表 B 中就都不存在了。显然地,表 B 的主键索引更紧凑,数据页的利用率也更高。如果我们把表 B 作为临时表,数据从表 A 导入表 B 的操作完成后,用表 B 替换 A,从效果上看,就起到了收缩表 A 空间的作用。

这里,你可以使用 alter table A engine=InnoDB 命令来重建表。在 MySQL 5.5 版本之前,这个命令的执行流程跟我们前面描述的差不多,区别只是这个临时表 B 不需要你自己创建,MySQL 会自动完成转存数据、交换表名、删除旧表的操作。显然,花时间最多的步骤是往临时表插入数据的过程,如果在这个过程中,有新的数据要写入到表 A 的话,就会造成数据丢失。因此,在整个 DDL 过程中,表 A 中不能有更新。也就是说,这个 DDL 不是 Online 的。

MySQL 5.6 版本开始引入的 Online DDL,对这个操作流程做了优化。

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

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

  • 生成临时文件的过程中,将所有对 A 的操作记录在一个日志文件(row log)中;

  • 临时文件生成后,将日志文件中的操作应用到临时文件,得到一个逻辑数据上与表 A 相同的数据文件;(应用row log的过程可能又回有页分裂)

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

可以看到,在这个过程中,由于日志文件记录和重放操作这个功能的存在,这个方案在重建表的过程中,允许对表 A 做增删改操作。这也就是 Online DDL 名字的来源。

需要补充说明的是,上述的这些重建方法都会扫描原表数据和构建临时文件。对于很大的表来说,这个操作是很消耗 io 和 CPU 资源的。因此,如果是线上服务,你要很小心地控制操作时间。

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

  • 从 MySQL 5.6 版本开始,alter table t engine = InnoDB(也就是 recreate)默认的就是上面online DDL 的流程了;

  • analyze table t 其实不是重建表,只是对表的索引信息做重新统计,没有修改数据,这个过程中加了 MDL 读

  • optimize table t 等于 recreate+analyze。

“MySQL分库分表后总存储变大了的原因是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL分库分表后总存储变大了的原因是什么

本文链接: https://www.lsjlt.com/news/61980.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL分库分表后总存储变大了的原因是什么
    本篇内容介绍了“MySQL分库分表后总存储变大了的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • 需要分库分表的原因是什么
    这篇文章主要讲解了“需要分库分表的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“需要分库分表的原因是什么”吧!为什么要分库分表首先回答一下为什么要...
    99+
    2024-04-02
  • MySQL分页存储过程的实现原理是什么
    MySQL分页存储过程的实现原理是通过使用存储过程来动态生成分页查询语句,实现分页功能。存储过程是一组预先编译好的SQL语句组成的代...
    99+
    2024-04-09
    MySQL
  • MySQL 5.7分区表性能下降的原因是什么
    这篇文章主要讲解了“MySQL 5.7分区表性能下降的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL 5.7分区表性能下降的原因是什么”...
    99+
    2024-04-02
  • MySQL分区表中分区键必须是主键一部分的原因是什么
    这篇文章主要介绍了MySQL分区表中分区键必须是主键一部分的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL分区表中分区键必须是主键一部分的原因是什么文章都会有所收获,下面我们一起来看看吧。前...
    99+
    2023-06-29
  • minio分布式存储的原理是什么
    Minio是一个开源的分布式对象存储系统,其原理是将数据分片存储在多个节点上,实现数据的高可用性和可扩展性。Minio采用的是Era...
    99+
    2024-04-09
    minio
  • Xfce大行其道的七大原因分别是什么
    本篇文章给大家分享的是有关Xfce大行其道的七大原因分别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。长期以来,Xfce一向是人气排在第三位的Linux桌面。十多年来,它...
    99+
    2023-06-16
  • hdfs分布式存储数据的原理是什么
    HDFS(Hadoop Distributed File System)是一种分布式文件系统,它由多个节点组成,每个节点都可以存储数...
    99+
    2024-04-09
    hdfs
  • 服务器分布式存储的六大优点是什么
    本篇内容介绍了“服务器分布式存储的六大优点是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!分布式存储往往采用分布式的系统结构,利用多台存...
    99+
    2023-06-02
  • 使用数据库分区的原因及好处是什么
    这篇文章主要介绍“使用数据库分区的原因及好处是什么”,在日常操作中,相信很多人在使用数据库分区的原因及好处是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”使用数据库分区的...
    99+
    2024-04-02
  • MySQL中的视图、存储函数、存储过程、触发器分别是什么
    这篇文章主要讲解了“MySQL中的视图、存储函数、存储过程、触发器分别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中的视图、存储函数、存储过程、触发器分别是什么”吧!目录一...
    99+
    2023-06-20
  • WindowsXP系统所占空间内存为什么总是很大?空间占用大的原因分析与解决方法介绍
    现象:自从安装了WindowsXP后,使用一段时间发现经常登陆的一个用户的文件夹所占的空间特别大约1.2GB;可是其他不常登陆的只有10MB左右,这是怎么回事?  WindowsXP为每个用户都设置了各自的文件夹,把登...
    99+
    2023-05-31
    WindowsXP 空间内存 内存 空间 原因 系统 解决
  • PHP中数据表的选项和储存引擎分别是什么
    这篇文章主要讲解了“PHP中数据表的选项和储存引擎分别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中数据表的选项和储存引擎分别是什么”吧!表选...
    99+
    2024-04-02
  • 网站降权的九种原因及主要表现分别是什么
    这期内容当中小编将会给大家带来有关网站降权的九种原因及主要表现分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。随着SEO行业的发展,在这个行业中越来越多的人参与进...
    99+
    2024-04-02
  • MySQL中数据源管理和关系型分库分表以及列式库分布式计算分别指的是什么
    这篇文章将为大家详细讲解有关MySQL中数据源管理和关系型分库分表以及列式库分布式计算分别指的是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、数据拆...
    99+
    2024-04-02
  • Win10系统升级后为什么产品秘钥都是3V66T 升级win10后的产品部分密钥都是3V66T的原因
    不少细心的用户发现升级win10,Windows10产品秘钥都是:VK7JG-NPHTM-C97JM-9MPGT-3V66T,这是怎么回事呢?大家都是一样的会不会有什么影响呢?大家使用正版升级到win10的看一看密钥后五...
    99+
    2023-05-19
    Win10系统 升级 秘钥 3V66T
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作