MySQL 全库表记录统计与空间估算教程
🧩 MySQL 全库表记录统计与空间估算教程
🧮 一、获取所有表的记录条数
✅ 方法一:预估记录数(快,但不精确)
SELECTtable_name,table_rows
FROMinformation_schema.tables
WHEREtable_schema = 'your_database_name'AND table_type = 'BASE TABLE';
⚠️
table_rows
是估算值(特别是 InnoDB 下)。适用于快速查看数据规模。
✅ 方法二:生成精确 COUNT(*)
SQL(推荐用于分析)
SELECTCONCAT('SELECT "', table_name, '" AS table_name, COUNT(*) AS total_rows FROM `', table_name, '`;') AS query_sql
FROMinformation_schema.tables
WHEREtable_schema = 'your_database_name'AND table_type = 'BASE TABLE';
✅ 执行这些语句可以得出 各表真实记录数。适合用 Python/Java 等语言批量执行分析。
✅ 方法三:存储过程自动统计所有表的 COUNT(*)
DELIMITER //CREATE PROCEDURE count_all_tables()
BEGINDECLARE done INT DEFAULT FALSE;DECLARE tbl_name VARCHAR(64);DECLARE cur CURSOR FORSELECT table_name FROM information_schema.tablesWHERE table_schema = 'your_database_name' AND table_type = 'BASE TABLE';DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;DROP TEMPORARY TABLE IF EXISTS temp_counts;CREATE TEMPORARY TABLE temp_counts (table_name VARCHAR(64), total_rows BIGINT);OPEN cur;read_loop: LOOPFETCH cur INTO tbl_name;IF done THENLEAVE read_loop;END IF;SET @sql = CONCAT('INSERT INTO temp_counts SELECT "', tbl_name, '", COUNT(*) FROM `', tbl_name, '`');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;END LOOP;CLOSE cur;SELECT * FROM temp_counts;SELECT SUM(total_rows) AS all_table_total FROM temp_counts;
END //DELIMITER ;-- 调用方式:
CALL count_all_tables();
📦 二、估算数据库空间占用
✅ 方法一:获取所有表数据与索引占用空间
SELECT 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 / 1024, 2) AS total_gb
FROM information_schema.tables
WHERE table_schema = 'your_database_name';
可用于按表粒度统计空间使用,辅助分析清理对象。
✅ 方法二:估算每条记录大小(平均值)
SELECT table_name,table_rows,ROUND((data_length + index_length) / table_rows, 2) AS avg_bytes_per_row
FROM information_schema.tables
WHERE table_schema = 'your_database_name'AND table_rows > 0;
如果某表记录较多,可以根据此平均值估算该表或整库的空间需求。
📊 三、空间粗略估算参考表
假设有 303,645,670 行记录,以下为不同记录大小的估算值:
每行大小 | 总空间估算 |
---|---|
100 Byte | ≈ 28.3 GB |
200 Byte | ≈ 56.6 GB |
500 Byte | ≈ 141.2 GB |
1 KB | ≈ 283 GB |
🎯 常见结构中(多个
INT
,VARCHAR(50)
),一条记录常为 100~300 字节。
🧠 四、建议与补充说明
- 建议定期统计全库表记录数和空间大小,结合监控系统(如 Prometheus + Grafana)。
- 存储空间不仅包含数据,还包含索引、事务日志页、页目录等管理结构。
- 若使用分区表/分表策略,请分别处理各表的记录统计。
📌 附录:字段类型大小参考表(InnoDB)
类型 | 大小(字节) |
---|---|
TINYINT | 1 |
SMALLINT | 2 |
INT | 4 |
BIGINT | 8 |
FLOAT | 4 |
DOUBLE | 8 |
DECIMAL | 取决于精度 |
CHAR(n) | n 字节 |
VARCHAR(n) | 实际长度 + 1/2 字节头部 |
DATE | 3 |
DATETIME | 8 |
TEXT/BLOB | 存储在页外 + 头部4字节 |
✅ 总结流程图
flowchart TDA[统计所有表记录数] --> B1(方法一:估算)A --> B2(方法二:生成 SQL)A --> B3(方法三:存储过程)B1 --> C[可快速汇总]B2 --> D[精确统计,适合脚本]B3 --> DE[估算空间] --> F1(方式一:查询空间)E --> F2(方式二:记录平均大小)F1 --> G[汇总分析]F2 --> GG --> H[结果输出与监控展示]