最近有个需求需要查询MySQL表所占的体积(磁盘空间)大小,有几个方法记录一下:
1. 使用 INFORMATION_SCHEMA 数据库
这是最常用的方法,可以查询单个表或整个数据库的大小:
-- 查询特定表的大小
SELECT table_name 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)'
FROM information_schema.TABLES
WHERE table_schema = '数据库名' AND table_name = '表名';
或者:
-- 查询整个数据库中所有表的大小并排序
SELECT table_name 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)'
FROM information_schema.TABLES
WHERE table_schema = '数据库名'
ORDER BY (data_length + index_length) DESC;
2. 使用 SHOW TABLE STATUS 命令
-- 查看特定表的状态信息
SHOW TABLE STATUS FROM 数据库名 WHERE Name = '表名';
或者:
-- 格式化输出表大小
SELECT table_name AS '表名', ROUND(((data_length + index_length) / 1024 / 1024), 2) AS '总大小(MB)'
FROM information_schema.TABLES
WHERE table_schema = '数据库名' AND table_name = '表名';
3. 计算整个数据库的大小
-- 计算整个数据库的大小
SELECT table_schema AS '数据库', ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS '总大小(MB)'
FROM information_schema.TABLES
WHERE table_schema = '数据库名'
GROUP BY table_schema;
4. 在文件系统中查看实际文件大小
如果您有服务器访问权限,可以直接查看数据文件:
# 找到数据目录
mysql -e "SHOW VARIABLES LIKE 'datadir';"# 查看文件大小
cd /path/to/mysql/data/数据库名
ls -lh *.ibd
注意事项:
- InnoDB和MyISAM表的差异:
InnoDB可能会有表空间分配但未使用的空间
查询结果是分配的空间,不一定是实际使用的空间
- 数据压缩:
如果使用了压缩表,实际磁盘占用会小于查询结果
- 权限要求:
需要对information_schema有读取权限
- 数据一致性:
数据会有轻微延迟,不一定100%实时准确