前言
统计每个库、每张表的大小,是做数据治理时很常见也很实用的一类需求。很多时候,我们并不需要一上来就做精确到字节级别的盘点,先看一个大致量级,往往就足够判断容量分布、找出大表和热点库。
MySQL 的数据字典库 information_schema 里已经保存了这类统计信息,包括预估行数、数据大小、索引大小以及碎片大小等。需要注意的是,TABLE_ROWS 这类字段对 InnoDB 表并不精确,但对 MyISAM 表通常是准确的。如果只是想快速了解每个库、每张表的大概体量,直接查 information_schema.tables 就够用了。
一、统计所有数据库的大小
如果你想先看整个实例里所有数据库加起来占了多少空间,可以直接汇总 DATA_LENGTH:
mysql> USE information_schema;
Database changed
mysql> SELECT CONCAT(ROUND(SUM(DATA_LENGTH) / 1024 / 1024, 2), 'MB') AS data
FROM TABLES;
+-----------+
| data |
+-----------+
| 1101.44MB |
+-----------+
1 row in set (0.09 sec)
这里统计的是所有表的数据页大小之和,也就是数据本身占用的空间。要是还想把索引也算进去,可以继续往下看。
二、统计所有表的大小
如果目标不是看单纯的数据量,而是希望知道整个实例的总占用,那就把数据区和索引区一起加上。MySQL 里常见的做法是根据 AVG_ROW_LENGTH、TABLE_ROWS 和 INDEX_LENGTH 来估算:
mysql> SELECT SUM(AVG_ROW_LENGTH * TABLE_ROWS INDEX_LENGTH) total_mb
information_schema.TABLES;
total_mb

