必须通过information_schema.TABLES查询DATA_LENGTH,它表示表数据页的近似字节数,非实时精确值,单位需换算为MB才直观,且不可在普通表中直接引用。

查 DATA_LENGTH 必须用 information_schema.TABLES
MySQL 不提供直接函数(比如 get_table_size())来查单表磁盘占用,DATA_LENGTH 是 information_schema.TABLES 视图里的一个字段,它反映的是表数据页(.ibd 文件主体)的近似字节数,不是磁盘上最终占用的精确值,但对日常评估足够可靠。
常见错误是试图在普通 SELECT 中直接引用 DATA_LENGTH,比如 SELECT DATA_LENGTH FROM my_table —— 这会报错,因为该字段只存在于元数据视图中。
- 必须查
information_schema.TABLES,且指定TABLE_SCHEMA(库名)和TABLE_NAME(表名) - 注意权限:用户需有对
information_schema的 SELECT 权限(通常默认有) -
DATA_LENGTH对 MyISAM 和 InnoDB 都有效,但含义略有不同:InnoDB 下包含聚簇索引数据页,不含二级索引;MyISAM 下是.MYD文件大小
查单表空间大小的最小可用 SQL
最简写法就是一条带条件的查询,结果单位是字节,建议转成 MB 更直观:
SELECT TABLE_NAME, ROUND(DATA_LENGTH / 1024 / 1024, 2) AS data_size_mb, ROUND(INDEX_LENGTH / 1024 / 1024, 2) AS index_size_mb, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS total_size_mb FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'your_table_name';
注意:INDEX_LENGTH 是单独字段,不能忽略——尤其当表有大量二级索引时,它可能接近甚至超过 DATA_LENGTH。
- 别漏掉
TABLE_SCHEMA条件,否则可能跨库匹配到同名表 - 如果表名含特殊字符或大小写敏感,确保引号或大小写完全一致(Linux 系统下库/表名默认区分大小写)
- 查询结果可能延迟:InnoDB 的统计值由采样估算而来,非实时精确值;如需刷新,可执行
ANALYZE TABLE your_table_name
为什么 DATA_LENGTH 和 du -h 查出的 .ibd 文件大小不一致
这是最容易困惑的点。DATA_LENGTH 是 MySQL 内部统计的「已使用数据页字节数」,而 du -h /var/lib/mysql/your_db/your_table.ibd 显示的是文件在磁盘上的实际分配大小(含空闲页、未回收的删除空间、碎片等)。
- InnoDB 表删除大量数据后,
DATA_LENGTH会下降,但.ibd文件尺寸通常不会自动收缩(除非开启innodb_file_per_table并执行OPTIMIZE TABLE) -
DATA_LENGTH不包含 Undo 日志、Redo 缓冲区、临时排序空间等运行时开销 - 如果启用了压缩(
ROW_FORMAT=COMPRESSED),DATA_LENGTH是解压后的逻辑大小,而磁盘文件是压缩后的物理大小
批量查多个表或整个库的空间分布
把 WHERE 条件放宽就能快速看清库内“大户”:
SELECT TABLE_NAME, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS total_mb FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_database_name' ORDER BY total_mb DESC LIMIT 10;
这种写法适合快速定位膨胀表。但要注意:
- 大库执行可能较慢,因为
information_schema.TABLES在某些旧版本 MySQL(如 5.6)中会触发全表扫描式统计 - 如果看到某张表
DATA_LENGTH为 0 但TABLE_ROWS很大,大概率是统计信息过期,应ANALYZE TABLE - 不要依赖
DATA_LENGTH做容量精准规划,它只是辅助判断;真正做磁盘预算得看du或监控工具采集的文件系统级指标
DATA_LENGTH 的价值在于快速横向对比和趋势观察,而不是绝对精度。一旦发现某张表增长异常,再结合 SHOW CREATE TABLE、慢查日志、以及 INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS 深挖才更有效。











