
在 MySQL 中查看数据库大小是一个非常常见的需求。主要有两种场景:
-
查看单个数据库的总大小。
-
查看一个数据库中每个表的大小。
以下是实现这两种需求的详细方法。
这个方法通过查询 MySQL 自带的 information_schema 数据库来实现,它存储了所有数据库的元数据(关于数据的数据)。
你可以直接复制并执行以下 SQL 命令,只需将 your_database_name 替换成你想要查询的数据库名即可。
SELECT
table_schema AS `Database`,
SUM(data_length + index_length) / 1024 / 1024 AS `Size (MB)`
FROM
information_schema.TABLES
WHERE
table_schema = 'your_database_name'
GROUP BY
table_schema;
命令解释:
-
information_schema.TABLES: 这是一个特殊的表,它记录了所有数据库中所有表的信息,包括名称、大小等。
-
table_schema: 代表数据库的名称。
-
data_length: 表中数据的大小(字节)。
-
index_length: 表中索引的大小(字节)。
-
data_length + index_length: 数据大小 + 索引大小,这才是一个表实际占用的磁盘空间。
-
/ 1024 / 1024: 将字节(Byte)单位转换为兆字节(MB),方便阅读。如果你想查看 GB,可以再 / 1024 一次。
-
WHERE table_schema = 'your_database_name': 指定要查询的数据库。
示例输出:
假设我们查询一个名为 sakila 的数据库:
+------------+-----------+
| Database | Size (MB) |
+------------+-----------+
| sakila | 16.78 |
+------------+-----------+
这表示 sakila 数据库总共占用了约 16.78 MB 的磁盘空间。
如果你想知道数据库里哪个表最占空间,这个方法非常有用。同样是查询 information_schema。
SELECT
table_name AS `Table`,
ROUND((data_length + index_length) / 1024 / 1024, 2) AS `Size (MB)`
FROM
information_schema.TABLES
WHERE
table_schema = 'your_database_name'
ORDER BY
(data_length + index_length) DESC;
命令解释:
-
这个命令与上一个类似,但它:
-
查询的是
table_name 而不是 table_schema。
-
没有使用
GROUP BY,因为我们希望看到每个表的详情。
-
使用了
ORDER BY ... DESC,将最大的表排在最前面。
-
ROUND(..., 2) 用于将结果四舍五入到两位小数。
示例输出:
+-------------------+-----------+
| Table | Size (MB) |
+-------------------+-----------+
| film_text | 4.52 |
| payment | 3.81 |
| rental | 3.15 |
| inventory | 2.23 |
| customer | 0.52 |
| ... | ... |
+-------------------+-----------+
从这个结果可以清晰地看到 film_text 表是 sakila 数据库中最大的表。
如果你想对服务器上所有数据库的空间占用情况有一个整体的了解,可以使用以下命令。
SELECT
table_schema AS `Database`,
SUM(data_length + index_length) / 1024 / 1024 AS `Size (MB)`
FROM
information_schema.TABLES
GROUP BY
table_schema
ORDER BY
SUM(data_length + index_length) DESC;
命令解释:
-
这个命令省略了
WHERE 子句,这样就会统计所有数据库。
-
GROUP BY table_schema 将结果按数据库分组。
-
ORDER BY ... DESC 将最大的数据库排在最前面。
示例输出:
+--------------------+-----------+
| Database | Size (MB) |
+--------------------+-----------+
| sakila | 16.78 |
| performance_schema | 0.76 |
| mysql | 0.58 |
| sys | 0.02 |
+--------------------+-----------+
-
权限问题:执行这些查询需要对
information_schema 数据库有读取权限。大多数普通用户都具备这个权限。
-
information_schema 的性能:在非常大的数据库(例如包含数十万张表)上查询 information_schema 可能会比较慢,因为它需要扫描所有表的元数据。
-
SHOW TABLE STATUS:你也可以使用 SHOW TABLE STATUS FROM your_database_name; 来查看表信息,但它不如查询 information_schema 灵活,特别是当你需要进行计算或排序时。
对于日常运维和分析,方法一和方法二 是最常用和最实用的。