查 information_schema.TABLES 是唯一靠谱方式,需用 data_length + index_length 再除以 1024² 换算为 MB,且必须加 WHERE table_schema = '库名' 和 table_type = 'BASE TABLE' 过滤。

查 information_schema.TABLES 是唯一靠谱方式
MySQL 没有内置命令直接显示“某张表占多少 MB”,必须查 information_schema.TABLES 视图。它里头的 data_length 和 index_length 字段加起来,才是真实磁盘占用(单位是字节)。别信 SHOW TABLE STATUS 的输出——它可能缓存、不准,尤其在 InnoDB 表上常滞后。
data_length + index_length 才是真实大小
很多人只看 data_length,漏掉索引部分,结果低估 30%–200% 不等。InnoDB 的二级索引、主键 B+ 树、全文索引都算在 index_length 里。实际空间 = data_length + index_length,再除以 1024² 才是 MB。
- 用
ROUND((data_length + index_length) / 1024 / 1024, 2)转成 MB,保留两位小数 - 过滤时务必加上
table_schema(库名),否则会混入系统表 - 注意
table_rows是估算值,不能用来反推大小
常见错误:没加 WHERE table_type = 'BASE TABLE'
不加这个条件,information_schema.TABLES 会返回视图(VIEW)、临时表、分区子表,甚至某些 MySQL 8.0 的内部元数据表,导致结果错乱或权限报错。视图没有物理存储,data_length 为 0,但你一加总就拉低平均值。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 必须显式写
AND table_type = 'BASE TABLE' - 如果只查单表,
AND table_name = 'your_table'要放在最后,避免索引失效 - MySQL 5.7 默认不收集统计信息,首次查可能看到全 0;执行
ANALYZE TABLE your_table再试
不同引擎下 data_length 含义差异大
InnoDB 和 MyISAM 对 data_length 的定义不同:MyISAM 是 .MYD 文件大小;InnoDB 是聚簇索引所占页的总字节数(含未填充空间)。所以同一张表在 InnoDB 下显示更大,不是 bug,是引擎特性。
- 如果你用的是 InnoDB(默认),
data_length包含主键 B+ 树所有叶子和非叶子节点 - 压缩表(
ROW_FORMAT=COMPRESSED)的data_length是解压后逻辑大小,不是磁盘文件大小 - 想看真实文件尺寸?得去 datadir 下看
.ibd文件,但要注意:它可能包含已删除但未 purge 的记录空间
查的时候别只盯着一个数字。data_free 字段更值得扫一眼——它代表“已分配但未使用的空间”,如果远大于 0,说明该表可能需要 OPTIMIZE TABLE,尤其在频繁 DELETE/UPDATE 后。这个值在 information_schema.TABLES 里,但容易被忽略。










