查 information_schema.tables 是最直接的方式,通过聚合 data_length 与 index_length 字段可计算数据库磁盘占用,单位为字节,需转换为 mb 并注意权限、字段名正确性及 innodb 空间滞后问题。

查 information_schema.TABLES 是最直接的方式
MySQL 没有内置“数据库大小”字段,得靠聚合表数据算出来。核心就是查 information_schema.TABLES 视图,它记录了每张表的 DATA_LENGTH(数据大小)和 INDEX_LENGTH(索引大小),加起来就是实际磁盘占用。
注意:这个视图里所有数值单位是字节,不是 MB/GB;而且只对 InnoDB、MyISAM 等支持该统计的引擎有效,临时表或内存表不会计入。
常用写法:
SELECT TABLE_SCHEMA AS `database`, ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS `size_mb` FROM information_schema.TABLES GROUP BY TABLE_SCHEMA ORDER BY size_mb DESC;
TABLE_SCHEMA 和 TABLE_NAME 别拼错
很多人复制 SQL 后手抖改错字段名,比如写成 SCHEMA_NAME 或 DB_NAME——这些字段根本不存在,会报 Unknown column 'xxx' in 'field list' 错误。
务必确认用的是:
-
TABLE_SCHEMA:对应数据库名(即CREATE DATABASE时的名字) -
TABLE_NAME:对应表名 -
DATA_LENGTH+INDEX_LENGTH:二者必须同时加,光看数据不看索引会严重低估
如果只想查某个库,加 WHERE TABLE_SCHEMA = 'your_db',别漏单引号。
权限不足时查不到数据,不是 SQL 写错了
普通用户默认无法访问 information_schema.TABLES 的全部行——MySQL 会自动过滤掉你没权限的库。结果就是:明明库存在,但查询返回空,或者只看到 mysql、performance_schema 这几个系统库。
解决办法只有两个:
- 用有
SELECT权限的账号(如 root)执行 - 给当前用户显式授权:
GRANT SELECT ON information_schema.TABLES TO 'user'@'host';
注意:information_schema 是只读视图,不能 GRANT ALL,SELECT 就够了。
InnoDB 表的大小可能滞后于实际磁盘占用
InnoDB 有独立表空间(innodb_file_per_table=ON)时,DATA_LENGTH 和 INDEX_LENGTH 是从表空间头信息里读的,但删除大量数据后,如果没有 OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB,这部分空间不会立刻还给文件系统,视图里数值也不会变小。
也就是说:你看到的 “1.2 GB”,磁盘上可能占着 1.8 GB(因为有碎片或未回收的空页)。此时更准的参考是直接看数据目录下的 .ibd 文件大小。
顺带一提:information_schema.TABLES 里的 TABLE_ROWS 也是估算值,不准,别拿它当真实行数用。











