mysql表大小限制_技术分享 | 在磁盘上查找 MySQL 表的大小
作者: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_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: 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_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表大小限制_技术分享 | 在磁盘上查找 MySQL 表的大小相关推荐
- plsql tables 没有表_技术分享 | 在磁盘上查找 MySQL 表的大小
作者:Peter Zaitsev 翻译:管长龙 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎.不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单 ...
- mysql 创建索引 终止_技术分享 | 常见索引问题处理
作者:EneTakane 数据库技术爱好者,爱可生 DBA 团队成员,负责 MySQL 日常问题处理以及数据库运维平台的问题排查,擅长 MySQL 主从复制及优化,喜欢钻研技术问题,还有不得不提的 w ...
- 2如何看表分区字段_技术分享|Oracle分区技术的实现总结
郝秉睿 青岛科技研发中心 相信对于分区技术,大家一定都有所了解.但是你知道Oracle一共有多少种分区技术么?它们的适用范围和规范是怎样?今天让我们一起来看一看Oracle分区技术的魅力. 在大型的数 ...
- mysql分布式主键_技术分享 | 优化 InnoDB 的主键
作者:Yves Trudeau 翻译:管长龙 前言 作为 Percona 的首席架构师,我的主要职责之一是对客户的数据库进行性能方面的优化,这使得工作复杂且非常有趣.在这篇文章中,我想讨论一个最重要的 ...
- mysql5.7.16 表空间加密_技术分享 | InnoDB 表空间加密
本文目录: 一.表空间加密概述 应⽤场景 加密插件 加密限制 注意事项 二.加密表空间 安装加密插件 配置表空间加密 查看表空间被加密的表 三.更新 master encryption key 四.导 ...
- mysql 行锁 超时_技术分享 | MySQL 行锁超时排查方法优化
作者:xuty 本文来源:原创投稿 * 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一.大纲 #### 20191219 10:10:10,234 | com.ali ...
- mysql内连接简写_技术分享 | MySQL 的 join_buffer_size 在内连接上的应用
本文详细介绍了 MySQL 参数 join_buffer_size 在 INNER JOIN 场景的使用,OUTER JOIN 不包含.在讨论这个 BUFFER 之前,我们先了解下 MySQL 的 I ...
- mysql安全无密码登录_技术分享 | 安全地无密码登录 MySQL
有人说最好的密码就是你不用记忆的.auth_socket 插件和 MariaDB 的 unix_socket 让这种想法在 MySQL 上变成可能. 这两个插件虽然不是新发布,但在 MariaDB 1 ...
- mysql 做回归模型_技术分享 | 我对 MySQL 隔离级别的剖析
隔离级别的产生 在串型执行的条件下,数据修改的顺序是固定的.可预期的结果,但是并发执行的情况下,数据的修改是不可预期的,也不固定,为了实现数据修改在并发执行的情况下得到一个固定.可预期的结果,由此产生 ...
最新文章
- 深度解读:人体防御病毒的免疫力究竟是什么?
- 数组遍历——Vue.js
- Windows 无法启动 NVIDIA Display Container LS 服务
- 赤兔四足机器人的作用_腾讯 Robotics X 实验室四足移动机器人Jamoca首亮相,可挑战高难度梅花桩...
- 什么是groupid和artifactId?
- Centos 6.4 python 2.6 升级到 2.7一起的MySQLdb不能使用的解决问题
- 多层陶瓷电容器用处_典型陶瓷电容的用途和作用
- Linux之物理页面的分配
- java对象流定义_Java 对象流的用法,将自定义类数组写入文件中
- perl Makefile.PL;make;make install 安装时报错
- 网络知识 -- 第二部
- javascript中的this指向问题
- java 只保留字母_java编程问题,急急急!输入一个字符串,如果字符串中存在字母a的次数大于1,则只保留第一个a,...
- 富文本 和 图片裁切
- 同样是VPS,为什么RAKsmart更受欢迎
- bad interpreter
- mosquitto 使用详解
- Centos6.5离线安装中文输入法
- iOS底层原理探究 第一探. 事件传递和响应者链
- [黑马IOS自学第九篇]OC语言基础,面向对象概念,类的创建,OC多文件开发等
热门文章
- matlab求xk符号解,matlab符号运算习题
- vc++获取的蓝牙设备信息中rssi的值_Android低功耗蓝牙总结
- fastdfs详细安装教程
- IE浏览器兼容性调整总结技巧
- prometheus 插件node_exporter 启动方式
- linux安装无线电软件,基于Linux的软件无线电系统软件平台的研究与实现
- 欧文分校计算机新sat多少分录取,加州大学欧文分校SAT成绩要求是多少?
- c语言数据结构线性表LA和LB,数据结构(C语言版)设有线性表LA(3,5,8,110)和LB(2,6,8,9,11,15,20)求新集合?...
- python list除以_扫描器篇(三)之python编写基于字典的网站目录探测脚本
- 计算机无法安装win10,win10系统电脑提示“windows安装无法继续”的还原步骤