在运维 MySQL 数据库、服务器扩容、业务性能优化场景中,查看数据库整体容量、单表大小、磁盘实际占用是高频操作。很多开发者仅会简单查询数据量,却分不清逻辑数据大小与物理磁盘占用,也无法快速统计库、表、索引、碎片空间。

本文整理线上生产环境通用、兼容 MySQL 5.7/8.0 全版本的查询语句,从全局数据库容量、指定库大小、单表数据 + 索引、磁盘真实占用、空间碎片分析多维度讲解,语句可直接复制运行,同时附实操场景、结果解读与 SEO 友好的运维技巧,适合后端开发、DBA、运维人员收藏使用。
关键词:MySQL 查看数据库大小、MySQL 统计表容量、MySQL 磁盘占用、MySQL 表空间查询、MySQL 碎片清理
日常开发与运维中,监控数据库空间至关重要:
MySQL 中存在逻辑数据大小和物理磁盘占用两个概念:逻辑大小是单纯数据 + 索引的统计值,物理大小包含日志、碎片、临时空间,二者结果会存在差异,下文会逐一区分讲解。
环境说明:本文所有 SQL 语句兼容 MySQL 5.6、5.7、8.0,支持单机 MySQL、阿里云 / 腾讯云 RDS、自建 MySQL 集群。
MySQL 存储所有库、表、空间信息都在information_schema系统库中,这是查询容量的核心表,重点用到两张表:
常用字段释义(方便理解查询结果):
DATA_LENGTH:表数据空间大小(单位:字节)INDEX_LENGTH:表索引空间大小(单位:字节)DATA_FREE:表空闲碎片空间(InnoDB 引擎重点关注)TABLE_SCHEMA:数据库名称TABLE_NAME:数据表名称ENGINE:存储引擎(InnoDB/MyISAM)单位换算:1 MB = 1024 * 1024 字节,下文 SQL 已做单位转换,直接展示 MB/GB,无需手动计算。
需求:一次性查出服务器上所有数据库名称、数据总大小、索引大小、库总容量,全局盘点所有库空间占用。
SELECT TABLE_SCHEMA AS 数据库名, ROUND(SUM(DATA_LENGTH)/1024/1024, 2) AS 数据大小_MB, ROUND(SUM(INDEX_LENGTH)/1024/1024, 2) AS 索引大小_MB, ROUND((SUM(DATA_LENGTH) + SUM(INDEX_LENGTH))/1024/1024, 2) AS 数据库总容量_MB, ROUND((SUM(DATA_LENGTH) + SUM(INDEX_LENGTH))/1024/1024/1024, 4) AS 数据库总容量_GBFROM information_schema.TABLESGROUP BY TABLE_SCHEMAORDER BY 数据库总容量_MB DESC;
mysql、information_schema、performance_schema)为 MySQL 内置库,正常占用极小;数据大小和索引大小,若索引远大于数据,说明索引设计不合理。服务器日常巡检、新服务器资源盘点、多业务库空间整体监控。
如果只需要查看某一个业务库的总大小,使用以下语句,替换库名即可。
将 test_db 替换为你的实际数据库名:
SELECT ROUND(SUM(DATA_LENGTH)/1024/1024, 2) AS 数据大小_MB, ROUND(SUM(INDEX_LENGTH)/1024/1024, 2) AS 索引大小_MB, ROUND((SUM(DATA_LENGTH) + SUM(INDEX_LENGTH))/1024/1024, 2) AS 库总容量_MB, ROUND((SUM(DATA_LENGTH) + SUM(INDEX_LENGTH))/1024/1024/1024, 4) AS 库总容量_GBFROM information_schema.TABLESWHERE TABLE_SCHEMA = 'test_db';
部分库混合使用 InnoDB、MyISAM 引擎,可按引擎分组统计:
SELECT ENGINE AS 存储引擎, ROUND(SUM(DATA_LENGTH)/1024/1024, 2) AS 数据大小_MB, ROUND(SUM(INDEX_LENGTH)/1024/1024, 2) AS 总容量_MBFROM information_schema.TABLESWHERE TABLE_SCHEMA = 'test_db'GROUP BY ENGINE;
最常用的运维场景:查看某个库下每一张表的大小、数据、索引、行数,快速找出大表。
SELECT TABLE_NAME AS 表名, TABLE_ROWS AS 预估行数, ROUND(DATA_LENGTH/1024/1024, 2) AS 表数据_MB, ROUND(INDEX_LENGTH/1024/1024, 2) AS 表索引_MB, ROUND((DATA_LENGTH + INDEX_LENGTH)/1024/1024, 2) AS 表总大小_MB, ENGINE AS 存储引擎FROM information_schema.TABLESWHERE TABLE_SCHEMA = 'test_db'ORDER BY 表总大小_MB DESC;
TABLE_ROWS 为预估行数:InnoDB 引擎为抽样统计,存在误差;MyISAM 为精确行数;InnoDB 引擎在频繁增删改数据后,会产生大量空间碎片,碎片不会自动释放,导致:
SELECT TABLE_NAME AS 表名, ROUND(DATA_FREE/1024/1024, 2) AS 碎片空间_MB, ROUND((DATA_FREE/(DATA_LENGTH + INDEX_LENGTH)) * 100, 2) AS 碎片占比_百分比FROM information_schema.TABLESWHERE TABLE_SCHEMA = 'test_db' AND ENGINE = 'InnoDB'ORDER BY 碎片空间_MB DESC;
OPTIMIZE TABLE 表名; 整理碎片(会锁表,业务低峰执行)OPTIMIZE TABLE,修复表 + 整理碎片重要提醒:线上高并发业务,优先使用数据归档代替频繁碎片整理,避免锁表影响业务。
上述所有 SQL 查询的是MySQL 逻辑空间,和服务器磁盘实际占用可能不一致。想要查看真实磁盘占用,需要登录服务器执行 Linux 命令。
登录 MySQL 执行:
show variables like 'datadir';
输出示例:/usr/local/mysql/data/,此路径为 MySQL 数据根目录。
du -sh /usr/local/mysql/data/
du -sh /usr/local/mysql/data/test_db/
du -lh /usr/local/mysql/data/test_db/ | sort -rh
TABLE_SCHEMA名称,和实际数据库名保持一致。SELECT COUNT(*) FROM 表名; 精确统计。information_schema 查询权限;碎片占比超过 30% 建议整理碎片,务必选择凌晨、业务低峰期操作,防止锁表。
本文覆盖了 MySQL 查看容量的全场景方案,从 SQL 查询库、表、索引、碎片,到 Linux 系统查看物理磁盘占用,适配所有主流 MySQL 版本,语句可直接复制用于生产环境。
数据库空间监控是运维基础工作,建议将容量查询脚本加入定时巡检,提前发现空间隐患,保障业务稳定运行。
以上就是查看MySQL数据库容量大小的实用查询方法(含表数据、磁盘占用统计)的详细内容,更多关于MySQL数据库容量大小查看的资料请关注本站其它相关文章!
您可能感兴趣的文章: