返回顶部
首页 > 资讯 > 数据库 >MySQL表空间碎片的概念是什么
  • 928
分享到

MySQL表空间碎片的概念是什么

2023-06-14 23:06:17 928人浏览 泡泡鱼
摘要

这篇文章主要介绍MySQL表空间碎片的概念是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!背景经常使用 Mysql 的话,会发现 mysql 数据文件的磁盘空间一般会不停的增长,而且有时候删了数据或者插入一批数据

这篇文章主要介绍MySQL表空间碎片的概念是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

背景

经常使用 Mysql 的话,会发现 mysql 数据文件的磁盘空间一般会不停的增长,而且有时候删了数据或者插入一批数据的时候,磁盘空间有时候还会毫无变化。引发这个其妙现象的就是 Mysql 的表空间碎片。

什么是表空间碎片?

表空间碎片指的是表空间中存在碎片,形象一点来比喻的话,就像是一张 A4 纸,“表空间碎片”就像是把这张 A4 纸撕碎,再重新拼起来,各个碎片之间都会有一些缝隙存在,这些缝隙就是“表空间碎片”。重新拼起来的碎片实际上会比完整的 A4 纸大上一圈,这也代表着表空间容易引发的问题:空间浪费。

对于背景中描述的现象,可以用一张图来进行解释:

MySQL表空间碎片的概念是什么

图中的数字代表真实的数据行,圆角矩形代表一个表的表空间。从左往右,第一次操作是删除数据,由于 MySQL 在设计上是不会主动释放空间的,因此当表中的数据行被删除时,虽然数据被“删除”了,但是实际上这部分空间是没有释放的,依旧会被 Table A 占用,因此也就出现了这样子的情景:删除了日志表的很多数据,但是 MySQL 的磁盘空间并没有降低。

PS:这种不释放空间的设计多半和惰性删除有关,早期设计数据库时,使用的 io 设备一般是机械盘,读写性能比 SSD 差很多,所以删除操作一般不会直接触发磁盘上的数据删除。

可以看到数据删除之后,原本连续的空间中出现了两个空白的区域,这种一般就叫做表空间空洞,空洞太多了就叫做表空间碎片化(对应的是表空间连续)。这部分的空间虽然不会释放,但是会被标记为可重复利用,参考最右边的表空间示意图(第三个圆角矩形),当新插入数据的时候新数据会重新写入到表空间空洞中,这也代表着:在大规模删除过数据的表上,写入数据时,表空间可能不会明显增长或者不会增长。

实际上产生表空间空洞的操作并不只有 delete,update 也会引起这个问题,比如在 varchar 这种变长的字符型列中修改数据,改短一些的时候就会出现非常小的空洞,改长的话就有可能会因为空间不足导致把数据行的一些数据迁移到其他地方去。

怎么查看表空间碎片

MySQL 的系统表记录了表空间的使用情况,可以用如下查询检查:

SELECT CONCAT(table_schema,'.',table_name) AS 'table_name',                table_rows AS 'Number of Rows',                CONCAT(ROUND(data_length/(1024*1024),2),' M') AS 'data_size',                CONCAT(ROUND(index_length/(1024*1024),2),' M') AS 'index_size' ,                CONCAT(ROUND(data_free/(1024*1024),2),' M') AS'data_free',                CONCAT(ROUND(data_free/data_length,2),' %') AS 'data_free_pct',                ENGINE as 'engine'FROM infORMation_schema.TABLESWHERE table_schema = 'tablename' ORDER by data_free desc;

data_free 指表空间碎片的总空间大小,data_free_pct 指这个表的碎片百分比,效果如下:

mysql> SELECT CONCAT(table_schema,'.',table_name) AS 'table_name',    ->                 table_rows AS 'Number of Rows',    ->                 CONCAT(ROUND(data_length/(1024*1024),2),' M') AS 'data_size',    ->                 CONCAT(ROUND(index_length/(1024*1024),2),' M') AS 'index_size' ,    ->                 CONCAT(ROUND(data_free/(1024*1024),2),' M') AS'data_free',    ->                 CONCAT(ROUND(data_free/data_length,2),' %') AS 'data_free_pct',    ->                 ENGINE as 'engine'    -> FROM information_schema.TABLES    -> WHERE table_schema = 'sbtest'    -> ORDER by data_free desc;+----------------+----------------+-----------+------------+-----------+---------------+--------+| table_name     | Number of Rows | data_size | index_size | data_free | data_free_pct | engine |+----------------+----------------+-----------+------------+-----------+---------------+--------+| sbtest.sbtest5 |              0 | 0.02 M    | 0.00 M     | 44.00 M   | 2816.00 %     | InnoDB || sbtest.sbtest4 |         986400 | 214.70 M  | 15.52 M    | 4.00 M    | 0.02 %        | InnoDB || sbtest.sbtest3 |         986400 | 214.70 M  | 15.52 M    | 4.00 M    | 0.02 %        | InnoDB || sbtest.sbtest2 |         986400 | 214.70 M  | 15.52 M    | 4.00 M    | 0.02 %        | InnoDB || sbtest.sbtest1 |         987400 | 199.70 M  | 15.52 M    | 4.00 M    | 0.02 %        | InnoDB |+----------------+----------------+-----------+------------+-----------+---------------+--------+5 rows in set (0.00 sec)

第一行数据是测试用的数据,表中的所有数据都被删掉了,因此计算出来的 data_free_pct 超过了 100%。

怎么解决表空间碎片问题

目前,能够回收表空间的办法仅有一个,就是重建表,手段包括但不限于 optimize,alter table 等。alter table 的有些操作只能靠 rebuild 表来完成,所以有时候对大表进行一些维护操作之后,也会看到磁盘空间使用率下降,这就是回收了表空间碎片腾出来的那一部分空间。

从一般经验来看,表空间碎片的回收操作不建议经常执行,每个月一次就足够了,因为 rebuild 表对服务器的资源影响会比较大,且会影响这个表的写入操作。碎片率(data_free_pct)低于 20% 的时候也不用特别在意,除非磁盘空间非常紧张,且日志基本被清空。

对于回收空间的问题

对一些日志表,或者是有区域性特征的表,建议使用 MySQL 的分区表来管理,需要清理一批数据的时候,可以用 partition truncate 的方式进行清理,磁盘空间也能直接释放掉。

以上是“MySQL表空间碎片的概念是什么”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL表空间碎片的概念是什么

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

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

猜你喜欢
  • MySQL表空间碎片的概念是什么
    这篇文章主要介绍MySQL表空间碎片的概念是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!背景经常使用 MySQL 的话,会发现 MySQL 数据文件的磁盘空间一般会不停的增长,而且有时候删了数据或者插入一批数据...
    99+
    2023-06-14
  • MySQL 表空间碎片的概念及相关问题解决
    背景 经常使用 MySQL 的话,会发现 MySQL 数据文件的磁盘空间一般会不停的增长,而且有时候删了数据或者插入一批数据的时候,磁盘空间有时候还会毫无变化。引发这个其妙现象的就是 MySQL 的表空间碎片。 什...
    99+
    2022-05-25
    MySQL 表空间碎片 MySQL 表空间碎片问题解决
  • MySQL - 表空间碎片整理方法
    MySQL数据库中的表在进行了多次delete、update和insert后,表空间会出现碎片。定期进行表空间整理,消除碎片可以提高访问表空间的性能。 检查表空间碎片 下面这个实验用于验证进行表空间整理后对性能的影响,首先检查这个...
    99+
    2023-10-25
    mysql adb android
  • 浅谈mysql中各种表空间(tablespaces)的概念
    mysql中,会涉及到各种表空间的概念,虽然,很多方面这些概念和Oracle有相似性,但也有很多不同的地方,初学者很容易被这些概念弄的晕头转向,从而,混淆这些概念的区别和理解,下面,就简要介绍和说明一下这些...
    99+
    2024-04-02
  • MySQL表的碎片整理和空间回收的方法
    目录MySQL表碎片化(Table Fragmentation)的原因行碎片(Row fragmentation)行间碎片(Intra-row fragmentaion)剩余空间碎片...
    99+
    2024-04-02
  • ORACLE中表空间和表碎片的示例分析
    这篇文章主要为大家展示了“ORACLE中表空间和表碎片的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ORACLE中表空间和表碎片的示例分析”这篇文章吧...
    99+
    2024-04-02
  • MySQL的表空间是什么
    今天我要跟你分享的话题是:“大家常说的表空间到底是什么?究竟什么又是数据表?” 这其实是一个概念性的知识点,当作拓展知识。涉及到的概念大家了解一下就好,涉及的参数,留个印象就好。 一、什么是表? 但凡是用过MySQL...
    99+
    2022-05-23
    MySQL MySQL 表空间
  • java空指针的概念是什么
    在Java中,空指针是指一个变量被赋值为null,然后尝试访问该变量的实例方法或实例字段时出现的错误。当一个变量为空时,它不指向任何...
    99+
    2024-02-29
    java
  • mysql hint的概念是什么
    这篇文章主要介绍了mysql hint的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql hint的概念是什么文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2024-04-02
  • mysql-connector的概念是什么
    这篇文章主要介绍“mysql-connector的概念是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql-connector的概念是什么”文章能帮助大家...
    99+
    2024-04-02
  • mysql workbench的概念是什么
    这篇文章主要讲解了“mysql workbench的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql workbench的概念是什么”吧!...
    99+
    2024-04-02
  • mysql fabric的概念是什么
    本文小编为大家详细介绍“mysql fabric的概念是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“mysql fabric的概念是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学...
    99+
    2023-04-07
    mysql fabric
  • mysql comment的概念是什么
    今天小编给大家分享一下mysql comment的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
    99+
    2023-04-19
    mysql comment
  • SQL Server表空间碎片化回收的实现
    目录1 锁片化的产生1.1 产生碎片化的原因1.2 碎片化的影响1.3 定位碎片化2 碎片化处理2.1 删除并重建聚集索引2.2 DROP_EXISTING2.3 DBCC ...
    99+
    2024-04-02
  • mysql表空间指的是什么
    MySQL表空间是指存储表数据和索引的物理空间。在MySQL中,每个数据库都由一个或多个表空间组成,每个表空间又由一个或多个数据文件...
    99+
    2023-10-19
    mysql
  • SQL Server表空间碎片化回收怎么实现
    这篇文章主要介绍了SQL Server表空间碎片化回收怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SQL Server表空间碎片化回收怎么实现文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-06-29
  • MySQL中锁的概念是什么
    今天就跟大家聊聊有关MySQL中锁的概念是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。乐观锁乐观锁大多是基于数据版本记录机制实现,一般是给数据...
    99+
    2024-04-02
  • mysql主从的概念是什么
    这篇“mysql主从的概念是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql主...
    99+
    2024-04-02
  • mysql中odbc的概念是什么
    今天小编给大家分享一下mysql中odbc的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
    99+
    2024-04-02
  • 什么是SQLServer表的基本概念
    什么是SQLServer表的基本概念,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。SQLServer表的基本概念  表是包含数...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作