资讯专栏INFORMATION COLUMN

MySQL命令统计的库大小和物理文件大小差异

社区管理员 / 880人阅读

一、MySQL数据库容量查询方法

1.1 查看所有数据库容量大小

select 
table_schema as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
group by table_schema
order by sum(data_length) desc, sum(index_length) desc;

1.2 看所有数据库各表容量大小

select 
table_schema as '数据库',
table_name as '表名',
table_rows as '记录数',
truncate(data_length/1024/1024, 2) as '数据容量(MB)',
truncate(index_length/1024/1024, 2) as '索引容量(MB)'
from information_schema.tables
order by data_length desc, index_length desc;

1.3 查看指定数据库容量大小(如mysql库)

select 
table_schema as '数据库',
table_name as '表名',
table_rows as '记录数',
truncate(data_length/1024/1024, 2) as '数据容量(MB)',
truncate(index_length/1024/1024, 2) as '索引容量(MB)'
from information_schema.tables
where table_schema='mysql'
order by data_length desc, index_length desc;

二、命令统计表/库空间大小与表物理文件大小

2.1 MySQL表物理文件介绍

存储引擎是myisam, 在data目录下会看到3类文件:.frm、.myi、.myd
(1)*.frm--表定义,是描述表结构的文件。
(2)*.MYD--"D"数据信息文件,是表的数据文件。
(3)*.MYI--"I"索引信息文件,是表数据文件中任何索引的数据树

存储引擎是InnoDB, 在data目录下会看到2类文件:.frm、.ibd
(1)*.frm--表结构的文件。
(2)*.ibd--表数据和索引的文件。该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。

2.2 对比MySQL命令统计数据大小与真实物理文件差异

(1)命令统计confluence库表大小

mysql> select 
    -> table_schema as '数据库',
    -> table_name as '表名',
    -> table_rows as '记录数',
    -> truncate(data_length/1024/1024, 2) as '数据容量(MB)',
    -> truncate(index_length/1024/1024, 2) as '索引容量(MB)'
    -> from information_schema.tables
    -> where table_schema='confluence'
    -> order by data_length desc, index_length desc;
+------------+--------------------------------+-----------+------------------+------------------+
| 数据库      | 表名                           | 记录数    | 数据容量(MB)     | 索引容量(MB)       |
+------------+--------------------------------+-----------+------------------+------------------+
| confluence | BODYCONTENT                    |      3836 |            72.46 |             0.18 |
| confluence | scheduler_run_details          |    606729 |            51.57 |            90.40 |
| confluence | EVENTS                         |     14428 |            10.09 |             9.09 |

(2)查看confluence库中表物理文件大小

[root@blogs-v2 confluence]# ll -h -S
total 404M
-rw-r----- 1 polkitd input 164M May 18 18:26 scheduler_run_details.ibd
-rw-r----- 1 polkitd input  84M May 18 17:35 BODYCONTENT.ibd
-rw-r----- 1 polkitd input  29M May 18 17:35 EVENTS.ibd

通过(1)(2)对比不难发现,以BODYCONTENT、scheduler_run_details、EVENTS  表为例,命令统计其数据文件大小分别是72.46MB、51.57MB、10.09MB,而查看对应表的物理文件,发现大小分别是164MB、84MB、29MB。三张表的物理文件大小是命令行统计大小的2-3倍左右,那么为什么会出现这种情况呢?命令统计大小不应该和实际物理文件一样大嘛?当然不是!!!!

在现实生产环境中,这种差异有时会达到数十倍关系,导致数据库磁盘空间暴涨,为了避免业务影响,通常需要扩容更大的磁盘空间应对,但这也间接增加了业务成本。那么我们就来讲讲导致这种现象的第一种可能:数据碎片。详情参考:MySQL删除数据空间没有释放-碎片 

由上述我们知道了第一种可能是数据碎片,下面我们就来探讨一下第二种可能:随着数据的增长物理文件本身会占用较大磁盘空间。这就好比为了让房子住更多的人,要加盖或者扩建一样,自然房子也越来越重。

+------------+--------------------------------+-----------+------------------+------------------+
| 数据库      | 表名                           | 记录数    | 数据容量(MB)     | 索引容量(MB)       |
+------------+--------------------------------+-----------+------------------+------------------+
| confluence | EVENTS                         |     14428 |            10.09 |             9.09 |
+------------+--------------------------------+-----------+------------------+------------------+

#(1)导出EVENTS表中的数据备用
[root@blogs-v2 ~]# mysqldump -uroot -P33306 -h$IP -p$Password confluence EVENTS > events.sql
[root@blogs-v2 ~]# ll -h
total 5.9M
-rw-r--r-- 1 root root 5.9M May 19 10:10 events.sql # 可以看出导出前events数据文件+索引是19.18MB导出后是5.9MB肯定是被压缩了

#(2)新建测试库test,新建表events
mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> use test;
Database changed
mysql> CREATE TABLE `EVENTS` (
    ->   `rev` varchar(255) COLLATE utf8mb4_bin NOT NULL,
    ->   `history` varchar(255) COLLATE utf8mb4_bin NOT NULL,
    ->   `partition` int(11) NOT NULL,
    ->   `sequence` int(11) NOT NULL,
    ->   `event` mediumblob,
    ->   `contentid` bigint(20) NOT NULL,
    ->   `inserted` datetime(6) NOT NULL,
    ->   PRIMARY KEY (`rev`,`history`),
    ->   UNIQUE KEY `e_h_r_idx` (`history`,`rev`),
    ->   UNIQUE KEY `e_h_p_s_idx` (`history`,`partition`,`sequence`),
    ->   KEY `e_c_i_idx` (`contentid`,`inserted`),
    ->   KEY `e_i_c_idx` (`inserted`,`contentid`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

#(3)此时查看空表物理文件大小
[root@blogs-v2 test]# ll -h -S
total 176K
-rw-r----- 1 polkitd input 160K May 19 10:21 EVENTS.ibd
-rw-r----- 1 polkitd input 8.6K May 19 10:21 EVENTS.frm
-rw-r----- 1 polkitd input   60 May 19 10:20 db.opt

#(4)向test库中还原数据
mysql> source /root/events.sql

#(5)命令查看表数据大小和查看物理文件大小
+--------------------+-----------------+-----------+------------------+------------------+
| 数据库              | 表名            | 记录数    | 数据容量(MB)      | 索引容量(MB)      |
+--------------------+-----------------+-----------+------------------+------------------+
| test               | EVENTS          |     14065 |             6.57 |            13.15 |
+--------------------+-----------------+-----------+------------------+------------------+

[root@blogs-v2 test]# ll -h -S
total 28M
-rw-r----- 1 polkitd input  27M May 19 10:26 EVENTS.ibd
-rw-r----- 1 polkitd input 8.6K May 19 10:26 EVENTS.frm
-rw-r----- 1 polkitd input   60 May 19 10:20 db.opt

通过上述实验不难发现空表EVENTS占用磁盘空间160k,随着导入5.9MB events.sql的数据备份,命令查看EVENTS表数据文件大小是6.57MB,EVENTS物理文件大小是27MB,接近5倍的关系。当然这里出现了命令行统计的索引文件大小为13.15MB和物理统计的索引文件大小为8.6k,有较大差异的,我暂时没有搞明白为什么,命令统计偏差这么大。待后续完善~


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128119.html

相关文章

  • MySQL存储引擎差异化实验

    摘要:本篇把最常用的存储引擎给大家做一个介绍,然后通过插入修改和并发实验来了解和验证一下它们之间的一些差异。存储引擎被设计为插件式结构,每种存储引擎可从运行的里动态加载或卸载。独立表结构的花每个表单文件存储,是之后的默认引擎。 本篇把MySQL最常用的存储引擎给大家做一个介绍,然后通过插入、修改和并发实验来了解和验证一下它们之间的一些差异。 一、MySQL存储引擎简介 存储引擎在MySQL...

    lufficc 评论0 收藏0
  • docker/k8s/云

    摘要:执行容器内部运行的执行工作作为容器的执行驱动,负责创建容器运行命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等。典型的在启动后,首先将设置为进行一系列检查然后将其切换为供用户使用。 在https://segmentfault.com/a/11... 容器,隔离,云的概述。这篇对其中用途广泛的docker,k8s做详细介绍,并给出云搭建的生态环境体系。 docker ...

    zollero 评论0 收藏0
  • docker/k8s/云

    摘要:执行容器内部运行的执行工作作为容器的执行驱动,负责创建容器运行命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等。典型的在启动后,首先将设置为进行一系列检查然后将其切换为供用户使用。 在https://segmentfault.com/a/11... 容器,隔离,云的概述。这篇对其中用途广泛的docker,k8s做详细介绍,并给出云搭建的生态环境体系。 docker ...

    wind5o 评论0 收藏0
  • 服务器系统优化

    摘要:数据库物理机采购位,一台机器颗。至少颗,缓存越大越好内存,个实例。,实例硬盘机械选,数量越多越好,转速越高越好性能高并发普通业务线上线下选使用或者设备,可提升上千倍的效率。 1、数据库物理机采购 CPU: 64位CPU,一台机器2-16颗CPU。至少2-4颗,L2(缓存)越大越好 内存: 96-128G,MySQL 3-4个实例。32-64G,1-2实例 硬盘:机械:选SAS,数量...

    CoderBear 评论0 收藏0
  • 服务器系统优化

    摘要:数据库物理机采购位,一台机器颗。至少颗,缓存越大越好内存,个实例。,实例硬盘机械选,数量越多越好,转速越高越好性能高并发普通业务线上线下选使用或者设备,可提升上千倍的效率。 1、数据库物理机采购 CPU: 64位CPU,一台机器2-16颗CPU。至少2-4颗,L2(缓存)越大越好 内存: 96-128G,MySQL 3-4个实例。32-64G,1-2实例 硬盘:机械:选SAS,数量...

    zhunjiee 评论0 收藏0

发表评论

0条评论

社区管理员

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<