mysql查看数据库大小,主要有两种场景

时间:2025-10-09 14:04

在 MySQL 中查看数据库大小是一个非常常见的需求。主要有两种场景:
  1. 查看单个数据库的总大小
  2. 查看一个数据库中每个表的大小
以下是实现这两种需求的详细方法。

方法一:查看单个数据库的总大小(最常用)

这个方法通过查询 MySQL 自带的 information_schema 数据库来实现,它存储了所有数据库的元数据(关于数据的数据)。
你可以直接复制并执行以下 SQL 命令,只需将 your_database_name 替换成你想要查询的数据库名即可。
sql
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 的数据库:
plaintext
+------------+-----------+
| Database   | Size (MB) |
+------------+-----------+
| sakila     | 16.78     |
+------------+-----------+
 
这表示 sakila 数据库总共占用了约 16.78 MB 的磁盘空间。

方法二:查看数据库中每个表的大小

如果你想知道数据库里哪个表最占空间,这个方法非常有用。同样是查询 information_schema
sql
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) 用于将结果四舍五入到两位小数。
示例输出:
plaintext
+-------------------+-----------+
| Table             | Size (MB) |
+-------------------+-----------+
| film_text         | 4.52      |
| payment           | 3.81      |
| rental            | 3.15      |
| inventory         | 2.23      |
| customer          | 0.52      |
| ...               | ...       |
+-------------------+-----------+
 
从这个结果可以清晰地看到 film_text 表是 sakila 数据库中最大的表。

方法三:查看所有数据库的大小

如果你想对服务器上所有数据库的空间占用情况有一个整体的了解,可以使用以下命令。
sql
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 将最大的数据库排在最前面。
示例输出:
plaintext
+--------------------+-----------+
| Database           | Size (MB) |
+--------------------+-----------+
| sakila             | 16.78     |
| performance_schema | 0.76      |
| mysql              | 0.58      |
| sys                | 0.02      |
+--------------------+-----------+
 

注意事项

  1. 权限问题:执行这些查询需要对 information_schema 数据库有读取权限。大多数普通用户都具备这个权限。
  2. information_schema 的性能:在非常大的数据库(例如包含数十万张表)上查询 information_schema 可能会比较慢,因为它需要扫描所有表的元数据。
  3. SHOW TABLE STATUS:你也可以使用 SHOW TABLE STATUS FROM your_database_name; 来查看表信息,但它不如查询 information_schema 灵活,特别是当你需要进行计算或排序时。

总结

目标 推荐方法
查看单个库总大小 查询 information_schema 并按 table_schema 分组。
查看库内各表大小 查询 information_schema 并按大小降序排列。
查看所有库大小 查询 information_schema,分组并排序。
对于日常运维和分析,方法一和方法二 是最常用和最实用的。
内网穿透工具自托管 vs 云端中转:穿云箭和花生壳优缺点深度分析
内网ip远程控制,借助内网IP实现远程控制的完整指南
远程访问内网IP:打破网络边界的连接艺术
理解Windows系统中的NAT转发功能
内网穿透工具自托管 vs 云端中转:穿云箭和花生壳优缺点分析
手把手配置SSR端口转发:UDP协议支持与高级设置详解
什么是nat123?nat123的核心功能
nat123端口映射:轻松实现外网访问内网
nat123下载:轻松获取内网穿透工具
nat123官网:老牌内网穿透工具