在 MySQL(5.6 ~ 8.0)中计算数据库与数据表“物理尺寸”与“逻辑尺寸”**的常用方法
                           
天天向上
发布: 2025-07-06 14:31:31

原创
825 人浏览过

下面演示**在 MySQL(5.6 ~ 8.0)中计算数据库与数据表“物理尺寸”与“逻辑尺寸”**的常用方法,均基于官方 information_schema & performance_schema 视图,不依赖第三方插件。所有示例可直接在 MySQL Shell / CLI (mysql) 中执行;若用 MariaDB 同样适用(列名相同)。


1.基础概念

说明
DATA_LENGTH表数据文件大小(字节)
INDEX_LENGTH索引占用大小(字节)
DATA_FREE已分配但未使用的空间(字节,InnoDB “碎片”)
总大小DATA_LENGTH + INDEX_LENGTH

源自 information_schema.TABLES 视图。


2.计算 单张表 大小

SELECT  
  table_schema                                          AS db,
  table_name,
  ROUND(data_length/1024/1024, 2)  AS data_mb,
  ROUND(index_length/1024/1024, 2) AS index_mb,
  ROUND((data_length+index_length)/1024/1024, 2) AS total_mb
FROM information_schema.tables
WHERE table_schema = 'your_db' AND table_name = 'your_table';

3.计算 整个数据库(Schema)大小

SELECT  
  table_schema                                          AS db,
  ROUND(SUM(data_length)/1024/1024, 2)  AS data_mb,
  ROUND(SUM(index_length)/1024/1024, 2) AS index_mb,
  ROUND(SUM(data_length+index_length)/1024/1024, 2) AS total_mb
FROM information_schema.tables
WHERE table_schema = 'your_db'
GROUP BY table_schema;

4.一次列出 所有数据库 大小

SELECT
  table_schema                                          AS db,
  ROUND(SUM(data_length)/1024/1024, 2)  AS data_mb,
  ROUND(SUM(index_length)/1024/1024, 2) AS index_mb,
  ROUND(SUM(data_length+index_length)/1024/1024, 2) AS total_mb
FROM information_schema.tables
GROUP BY table_schema
ORDER BY total_mb DESC;

跳过系统库:
… WHERE table_schema NOT IN ('mysql','sys','performance_schema','information_schema') …


5.建立 视图 便于日常查询

CREATE OR REPLACE VIEW v_db_size AS
SELECT
  table_schema,
  ROUND(SUM(data_length+index_length)/1024/1024,2) AS total_mb
FROM information_schema.tables
GROUP BY table_schema;

以后直接:

SELECT * FROM v_db_size ORDER BY total_mb DESC;

6.查询 分区表 各分区大小(8.0+)

SELECT
  table_schema,
  table_name,
  partition_name,
  ROUND(data_length/1024/1024,2) AS data_mb,
  ROUND(index_length/1024/1024,2) AS index_mb
FROM information_schema.partitions
WHERE table_schema = 'your_db' AND table_name = 'your_partitioned_tbl';

7.使用 performance_schema(8.0 推荐)

file_summary_by_event_name 统计物理文件读写、字节数:

SELECT
  SUBSTRING_INDEX(event_name,'/',-1) AS file,
  ROUND(SUM(number_of_bytes_read+number_of_bytes_write)/1024/1024,2) AS io_mb
FROM performance_schema.file_summary_by_event_name
WHERE event_name LIKE 'wait/io/file/innodb/%'
GROUP BY file
ORDER BY io_mb DESC;

8.CLI 快捷命令

  • 查看表状态:
  mysql -e "USE your_db; SHOW TABLE STATUS\G"
  • MySQL 自带工具:
  mysqlshow --status your_db        # 汇总
  mysqlshow --status your_db your_table

9.脚本化监控示例(Bash)

#!/usr/bin/env bash
mysql -Nse "
  SELECT table_schema, ROUND(SUM(data_length+index_length)/1024/1024,2) AS MB
  FROM information_schema.tables
  WHERE table_schema NOT IN ('mysql','sys','performance_schema','information_schema')
  GROUP BY table_schema;
"

可将输出推送到 Prometheus Pushgateway、Zabbix Sender 或记录日志。


10.注意事项 & 最佳实践

建议
InnoDB innodb_file_per_table=ON便于单表查看/收缩
长期碎片回收OPTIMIZE TABLEALTER TABLE … ENGINE=InnoDB;
监控阈值告警对数据库或磁盘分区设置使用率告警
备份 & 清理大体量表分区归档,读写分离

📚 官方参考


更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *