information_schema.TABLES 中的 DATA_LENGTH 和 INDEX_LENGTH 仅为逻辑估算值,不可信,因其不包含 ibdata1 系统表空间、未 purge 的 MVCC 历史数据、redo log、临时表及压缩表解压后偏差等,真实磁盘占用须用 du 或 ls -lh 验证。

information_schema 里查出来的表大小,只是逻辑估算值,不是真实磁盘占用。想快速定位大表、做容量评估可以,但删库/扩容前必须用系统命令交叉验证。
为什么 information_schema.TABLES 的 DATA_LENGTH 和 INDEX_LENGTH 不可信
这两个字段反映的是 InnoDB 引擎“当前分配并写入数据”的页空间,但不包含:
-
ibdata1中的系统表空间(如mysql库、undo log、数据字典) - 未 purge 的旧版本记录(MVCC 历史数据)
- 临时表、
ibtmp1、redo log(ib_logfile*)等完全不计入 - 压缩表(
ROW_FORMAT=COMPRESSED)下DATA_LENGTH是解压后估算值 - InnoDB 表启用
innodb_file_per_table=OFF时,所有表共用ibdata1,DATA_LENGTH无法对应物理文件大小
查单个表逻辑大小:用 SELECT 从 information_schema.tables
这是最常用也最易上手的方式,适用于日常巡检和粗略排序:
- 查某个库下所有表(按总大小倒序):
SELECT table_name AS '表名', ROUND((data_length + index_length) / 1024 / 1024, 2) AS '总大小(MB)', ROUND(data_length / 1024 / 1024, 2) AS '数据大小(MB)', ROUND(index_length / 1024 / 1024, 2) AS '索引大小(MB)', table_rows AS '行数' FROM information_schema.tables WHERE table_schema = 'your_db_name' ORDER BY (data_length + index_length) DESC;
- 只查一张表:
WHERE table_schema = 'db' AND table_name = 't1' - 注意
table_rows对 InnoDB 是采样估算,可能偏差很大,不能用于精确计数
查整个库逻辑总用量:SUM() 聚合 + GROUP BY
适合看库级容量分布,但别当成磁盘用量报告交出去:
- 每个库的逻辑数据+索引大小:
SELECT table_schema AS '数据库', CONCAT(ROUND(SUM(data_length) / 1024 / 1024, 2), ' MB') AS '数据大小', CONCAT(ROUND(SUM(index_length) / 1024 / 1024, 2), ' MB') AS '索引大小' FROM information_schema.tables GROUP BY table_schema ORDER BY SUM(data_length + index_length) DESC;
- 如果某库返回空结果,说明该库下没有 InnoDB 表(比如全是 MEMORY 或 CSV 引擎),或用户权限不足访问
information_schema -
DATA_FREE字段显示“已分配但未使用”的空间,对innodb_file_per_table=ON的表意义有限;对共享表空间则可能高达几 GB,但不代表能直接回收
真正要看磁盘占了多少?绕开 MySQL,用 du
information_schema 给的是“MySQL 认为自己用了多少”,而 du 才是“操作系统说你实际占了多少”。这两者差几十 GB 很常见。
- 查整个 MySQL 数据目录真实用量:
du -sh /var/lib/mysql - 查各库目录大小(含
.ibd、ibdata1、日志等):du -sh --max-depth=1 /var/lib/mysql | sort -hr - 单独看某张
innodb_file_per_table=ON表的物理文件:ls -lh /var/lib/mysql/your_db/your_table.ibd - 注意:
ibdata1、ib_logfile*、ibtmp1这些文件绝不能手动rm,删了 MySQL 启动会失败
information_schema 是好用的入口,但它只告诉你“MySQL 看到的表有多大”,而不是“这个 MySQL 实例在磁盘上到底吃掉了多少空间”。真要清理或扩容,du 和 ls -lh 才是你该盯住的命令。


















