作者:Peter Zaitsev
翻译:管长龙

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

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

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

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

此图显示了从 INFORMATION_SCHEMA.TABLES 获取的 data_lengthindex_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_lengthindex_length 的值,而是定期刷新它们 - 而且不规则地刷新它们。图表的后半部分一些数据刷新变得更加规律。这与图表的第一部分不同,后者似乎每次有 10% 的行更改时,就更新一次统计信息。table_rowsdata_freeupdate_time ,它们也是实时更新的。

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

  • 禁用 innodb_stats_persistent
  • 启用 innodb_stats_on_metadata

这两者都会带来严重的代价。禁用持久性统计信息意味着每次服务器启动时 InnoDB 都必须刷新统计信息,这代价很大,并且可能会在重新启动之间产生不稳定的查询计划。那有没有更好的办法呢?事实证明有。可以通过 INNODB_SYS_TABLESPACES 查看表空间信息表以查看实际文件大小。与 index_lengthdata_length 不同, INNODB_SYS_TABLESPACES 实时更新,无需特殊配置:

mysql> select * from INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES where name='sbinnodb/sbtest1' G
*************************** 1. row ***************************SPACE: 42NAME: sbinnodb/sbtest1FLAG: 33FILE_FORMAT: BarracudaROW_FORMAT: DynamicPAGE_SIZE: 16384
ZIP_PAGE_SIZE: 0SPACE_TYPE: Single
FS_BLOCK_SIZE: 4096FILE_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: 48NAME: sbinnodb/testcompFLAG: 33FILE_FORMAT: BarracudaROW_FORMAT: DynamicPAGE_SIZE: 16384
ZIP_PAGE_SIZE: 0SPACE_TYPE: Single
FS_BLOCK_SIZE: 4096FILE_SIZE: 285212672
ALLOCATED_SIZE: 113004544
1 row in set (0.00 sec)

如果您使用旧的 InnoDB 压缩(InnoDB 表压缩),您将看到 data_lengthindex_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表大小限制_技术分享 | 在磁盘上查找 MySQL 表的大小相关推荐

  1. plsql tables 没有表_技术分享 | 在磁盘上查找 MySQL 表的大小

    作者:Peter Zaitsev 翻译:管长龙 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎.不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单 ...

  2. mysql 创建索引 终止_技术分享 | 常见索引问题处理

    作者:EneTakane 数据库技术爱好者,爱可生 DBA 团队成员,负责 MySQL 日常问题处理以及数据库运维平台的问题排查,擅长 MySQL 主从复制及优化,喜欢钻研技术问题,还有不得不提的 w ...

  3. 2如何看表分区字段_技术分享|Oracle分区技术的实现总结

    郝秉睿 青岛科技研发中心 相信对于分区技术,大家一定都有所了解.但是你知道Oracle一共有多少种分区技术么?它们的适用范围和规范是怎样?今天让我们一起来看一看Oracle分区技术的魅力. 在大型的数 ...

  4. mysql分布式主键_技术分享 | 优化 InnoDB 的主键

    作者:Yves Trudeau 翻译:管长龙 前言 作为 Percona 的首席架构师,我的主要职责之一是对客户的数据库进行性能方面的优化,这使得工作复杂且非常有趣.在这篇文章中,我想讨论一个最重要的 ...

  5. mysql5.7.16 表空间加密_技术分享 | InnoDB 表空间加密

    本文目录: 一.表空间加密概述 应⽤场景 加密插件 加密限制 注意事项 二.加密表空间 安装加密插件 配置表空间加密 查看表空间被加密的表 三.更新 master encryption key 四.导 ...

  6. mysql 行锁 超时_技术分享 | MySQL 行锁超时排查方法优化

    作者:xuty 本文来源:原创投稿 * 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一.大纲 #### 20191219 10:10:10,234 | com.ali ...

  7. mysql内连接简写_技术分享 | MySQL 的 join_buffer_size 在内连接上的应用

    本文详细介绍了 MySQL 参数 join_buffer_size 在 INNER JOIN 场景的使用,OUTER JOIN 不包含.在讨论这个 BUFFER 之前,我们先了解下 MySQL 的 I ...

  8. mysql安全无密码登录_技术分享 | 安全地无密码登录 MySQL

    有人说最好的密码就是你不用记忆的.auth_socket 插件和 MariaDB 的 unix_socket 让这种想法在 MySQL 上变成可能. 这两个插件虽然不是新发布,但在 MariaDB 1 ...

  9. mysql 做回归模型_技术分享 | 我对 MySQL 隔离级别的剖析

    隔离级别的产生 在串型执行的条件下,数据修改的顺序是固定的.可预期的结果,但是并发执行的情况下,数据的修改是不可预期的,也不固定,为了实现数据修改在并发执行的情况下得到一个固定.可预期的结果,由此产生 ...

最新文章

  1. 深度解读:人体防御病毒的免疫力究竟是什么?
  2. 数组遍历——Vue.js
  3. Windows 无法启动 NVIDIA Display Container LS 服务
  4. 赤兔四足机器人的作用_腾讯 Robotics X 实验室四足移动机器人Jamoca首亮相,可挑战高难度梅花桩...
  5. 什么是groupid和artifactId?
  6. Centos 6.4 python 2.6 升级到 2.7一起的MySQLdb不能使用的解决问题
  7. 多层陶瓷电容器用处_典型陶瓷电容的用途和作用
  8. Linux之物理页面的分配
  9. java对象流定义_Java 对象流的用法,将自定义类数组写入文件中
  10. perl Makefile.PL;make;make install 安装时报错
  11. 网络知识 -- 第二部
  12. javascript中的this指向问题
  13. java 只保留字母_java编程问题,急急急!输入一个字符串,如果字符串中存在字母a的次数大于1,则只保留第一个a,...
  14. 富文本 和 图片裁切
  15. 同样是VPS,为什么RAKsmart更受欢迎
  16. bad interpreter
  17. mosquitto 使用详解
  18. Centos6.5离线安装中文输入法
  19. iOS底层原理探究 第一探. 事件传递和响应者链
  20. [黑马IOS自学第九篇]OC语言基础,面向对象概念,类的创建,OC多文件开发等

热门文章

  1. matlab求xk符号解,matlab符号运算习题
  2. vc++获取的蓝牙设备信息中rssi的值_Android低功耗蓝牙总结
  3. fastdfs详细安装教程
  4. IE浏览器兼容性调整总结技巧
  5. prometheus 插件node_exporter 启动方式
  6. linux安装无线电软件,基于Linux的软件无线电系统软件平台的研究与实现
  7. 欧文分校计算机新sat多少分录取,加州大学欧文分校SAT成绩要求是多少?
  8. c语言数据结构线性表LA和LB,数据结构(C语言版)设有线性表LA(3,5,8,110)和LB(2,6,8,9,11,15,20)求新集合?...
  9. python list除以_扫描器篇(三)之python编写基于字典的网站目录探测脚本
  10. 计算机无法安装win10,win10系统电脑提示“windows安装无法继续”的还原步骤