如何获取MySQL所有数据库的大小总和?
全数据库大小求和统计实现方案
完全兼容你原有计算逻辑的几种实现方式:
1. 直接查询全库总大小(最高效)
直接移除原有查询的分组逻辑,对所有表的大小字段做全局求和,换算规则、精度和你原有查询完全一致:
SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Total Size (GB)" FROM information_schema.TABLES;
2. 基于现有单库统计结果二次求和
如果你需要沿用原有单库统计的逻辑,先算出每个库的大小再累加,用子查询嵌套即可:
SELECT ROUND(SUM(`Size (GB)`), 2) AS "Total Size (GB)" FROM ( SELECT table_schema AS "Database", ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size (GB)" FROM information_schema.TABLES GROUP BY table_schema ) AS db_sizes;
3. 单库列表+合计行同步展示
如果想要在原有各库大小的结果末尾追加一行总计,直接用WITH ROLLUP实现分组汇总:
SELECT IFNULL(table_schema, "TOTAL") AS "Database", ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size (GB)" FROM information_schema.TABLES GROUP BY table_schema WITH ROLLUP;
执行后返回的最后一行Database为TOTAL的行就是所有库的大小总和。
注意事项
- 所有写法都沿用了你原有查询的换算规则、小数位精度,计算出的总和和你现有各库大小的手动累加结果完全一致,不会出现数值偏差。
- 换算规则提示:当前查询的换算式
/ 1024 / 1024实际是将字节单位转换为MB,如果你需要真实的GB单位,需要将换算式修改为/ 1024 / 1024 / 1024。 - 如果原有查询已经过滤了不需要统计的系统库(比如
mysql、sys、information_schema等),需要在以上所有查询的FROM子句后追加相同的WHERE过滤条件,保证统计范围一致,例如:WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys') - 第一种写法省略了单库分组的中间计算,查询效率最高,适合只需要总大小的场景。
内容的提问来源于stack exchange,提问作者Somethingwhatever
相关产品推荐
相关产品推荐

