首页 > 数据库 >技术分享 | 在磁盘上查找 MySQL 表的大小

技术分享 | 在磁盘上查找 MySQL 表的大小

时间:2022-12-20 15:38:30浏览次数:64  
标签:MySQL length 查找 InnoDB mysql 磁盘 row SIZE


作者:Peter Zaitsev
翻译:管长龙

我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 ​​INFORMATION_SCHEMA .TABLES​​ 中提供这些信息吗?没那么简单!

这个看似简单的问题实际上在 MySQL 中非常复杂。MySQL 支持许多存储引擎(其中一些根本不在磁盘上存储数据),这些存储引擎通常都以不同的布局存储数据。例如,InnoDB 存储引擎为 MySQL 5.7 提供了三种“基本”布局,其中包含 ​​row_formats​​ 和两种可压缩的种类。

简化一下:我们如何在磁盘上查找存储在其自己的表空间中的 InnoDB 表的表大小(前提是 ​​innodb_file_per_table = 1​​ )。

在我们得到答案之前,先展示通过 ​​sysbench​​ 运行预先获得的图表(批量数据插入表):

技术分享 | 在磁盘上查找 MySQL 表的大小_MySQL

此图显示了从 ​​INFORMATION_SCHEMA .TABLES​​​ 获取的 ​​data_length​​​ 和​​index_length​​ 所定义的表大小。可以预期,随着数据的增多,表格会跳跃增长(有时会增加 10GB 或更多)。

该图表与磁盘上数据的变化方式不匹配,它逐渐增长(如预期):

-rw-r----- 1 mysql mysql 220293234688 Jan 25 17:03 sbtest1.ibd
-rw-r----- 1 mysql mysql 220310011904 Jan 25 17:03 sbtest1.ibd
-rw-r----- 1 mysql mysql 222499438592 Jan 25 17:07 sbtest1.ibd

正如我们从这个实验中看到的那样,MySQL 并没有真正的实时维护 ​​data_length​​​ 和 ​​index_length​​​ 的值,而是定期刷新它们 - 而且不规则地刷新它们。图表的后半部分一些数据刷新变得更加规律。这与图表的第一部分不同,后者似乎每次有 10% 的行更改时,就更新一次统计信息。问题是,还有其他的值。例如 ​​table_rows​​​,​​data_free​​​ 或 ​​update_time​​ ,它们也是实时更新的。

要在 MySQL 5.7获取 ​​information_schema​​ 获取到更准确的实时信息,需要做两件事:

  • 禁用 ​​innodb_stats_persistent​
  • 启用 ​​innodb_stats_on_metadata​

这两者都会带来严重的代价。

禁用持久性统计信息意味着每次服务器启动时 InnoDB 都必须刷新统计信息,这代价很大,并且可能会在重新启动之间产生不稳定的查询计划。那有没有更好的办法呢?事实证明有。

可以通过 ​​INNODB_SYS_TABLESPACES​​​ 查看表空间信息表以查看实际文件大小。与 ​​index_length​​​ 和 ​​data_length​​​ 不同,​​INNODB_SYS_TABLESPACES​​ 实时更新,无需特殊配置:

mysql> select * from INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES where name='sbinnodb/sbtest1' \G  
*************************** 1. row ***************************
SPACE: 42
NAME: sbinnodb/sbtest1
FLAG: 33
FILE_FORMAT: Barracuda
ROW_FORMAT: Dynamic
PAGE_SIZE: 16384
ZIP_PAGE_SIZE: 0
SPACE_TYPE: Single
FS_BLOCK_SIZE: 4096
FILE_SIZE: 245937209344
ALLOCATED_SIZE: 245937266688
1 row in set (0.00 sec)

使用这个表的好处是,它还处理新功能 “InnoDB 页压缩”,正确显示了 ​​file_size​​​ (磁盘上的逻辑文件大小)和 ​​allocated_size​​(为此文件分配的空间,并且可以显着缩小)之间的区别。

最后,让我们看一下不同的 InnoDB 压缩方式如何影响 ​​information_schema​​ 中提供的信息。

mysql> select * from INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES where name='sbinnodb/testcomp' G  
*************************** 1. row ***************************
SPACE: 48
NAME: sbinnodb/testcomp
FLAG: 33
FILE_FORMAT: Barracuda
ROW_FORMAT: Dynamic
PAGE_SIZE: 16384
ZIP_PAGE_SIZE: 0
SPACE_TYPE: Single
FS_BLOCK_SIZE: 4096
FILE_SIZE: 285212672
ALLOCATED_SIZE: 113004544
1 row in set (0.00 sec)

如果您使用旧的 InnoDB 压缩(InnoDB 表压缩),您将看到 ​​data_length​​​ 和 ​​index_length​​​ 中显示的压缩数据大小作为结果。例如,​​avg_row_length​​ 将远低于您的预期。

如果在 MySQL 5.7 中使用新的 InnoDB 压缩(InnoDB 页压缩),您将看到与文件大小相对应的值,而不是如 ​​information_schema​​ 中所示的分配大小。

结论

回答一个微不足道的问题“这个表在磁盘上占用了多少空间?” 在 MySQL 中真的不是一个简单的问题 - 显而易见的数据,可能会得到错误的答案。

查看 ​​INFORMATION_SCHEMA .INNODB_SYS_TABLESPACES​​ 以获取 InnoDB 表的实际文件大小值。

原文链接:
​​​ https://www.percona.com/blog/2016/01/26/finding_mysql_table_size_on_disk/​


标签:MySQL,length,查找,InnoDB,mysql,磁盘,row,SIZE
From: https://blog.51cto.com/u_15077536/5955928

相关文章

  • 故障分析 | MySQL 数据”丢失”事件之 binlog 解析应用一则
    作者:余振兴爱可生DBA团队成员,熟悉Oracle、MySQL、MongoDB、Redis,最近在盘TiDB,擅长架构设计、故障诊断、数据迁移、灾备构建等等。负责处理客户MySQL及我司自研DMP数......
  • 第38期:MySQL 时间类分区具体实现
    适用分区或者说分表最多的场景依然是针对时间字段做拆分,这节我们详细讲讲如何更好的基于时间字段来拆分。分别按照年、月、日几个维度的实现方法以及一些细节注意事项。第......
  • 技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因
    作者:郭斌斌爱可生DBA团队成员,负责项目日常问题处理及公司平台问题排查。一、背景客户反馈生产环境中,MySQL5.7通过xtrabackup+Binlog做基于时间点的恢复操作时,持续卡......
  • 技术分享 | MySQL 执行 GROUP BY 的四种方式
    作者:PeterZaitsev翻译:管长龙在日常查询中,索引或其他数据查找的方法可能不是查询执行中最高昂的部分,例如:MySQLGROUPBY可能负责查询执行时间90%还多。MySQL执行GROUP......
  • 技术分享 | 从 MySQL 8.0 复制到 MySQL 5.7
    作者:ViniciusGrippa翻译:管长龙本文中,我们将讨论如何设置从MySQL8.0到MySQL5.7的复制。在某些情况下,使用此配置可能会有所帮助。例如,在MySQL升级的情况下,将使用较......
  • 技术分享 | MySQL 内存管理初探
    作者:xuty*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。一、背景经常在项目上碰到在没有大并发活跃SQL的情况下,MySQL所占用的物理内存......
  • 技术分享 | ProxySQL 搭配 MySQL HA (下)
    作者:杨涛涛资深数据库专家,专研MySQL十余年。擅长MySQL、PostgreSQL、MongoDB等开源数据库相关的备份恢复、SQL调优、监控运维、高可用架构设计等。目前任职于爱可生,为......
  • 技术分享 | 关于 MySQL 自增 ID 的事儿
    作者:贲绍华爱可生研发中心工程师,负责项目的需求与维护工作。其他身份:柯基铲屎官。当我们使用MySQL进行数据存储时,一般会为一张表设置一个自增主键,当有数据行插入时,该主键......
  • 技术分享 | MySQL:change buffer 何时生效
    作者:胡呈清爱可生DBA团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。已知changebuffer的原理对于普通二级索引,当插入、修改......
  • 技术分享 | 网络带宽如何影响 MySQL 性能
    作者:VadimTkachenko翻译:管长龙网络是数据库基础架构的主要部分。但是,通常性能基准测试是在本地计算机上完成的,客户端和服务器并置在一起。这样做是为了简化结构并排除一个......