You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MariaDB 10.1.10中获取数据库表的实时大小

MariaDB 10.1.10 无SSH权限下实时获取表大小可行方案

方案1:优化原生统计字段实时性

原有sum(data_length + index_length)精度不足的核心原因是InnoDB默认对information_schema.TABLES的统计数据做了缓存,不会实时刷新,可通过两种方式优化:

  • 临时对单表同步最新统计:查询前对目标表执行ANALYZE TABLE 库名.表名;,执行完成后再查询TABLES表即可拿到实时大小,该操作对小表几乎无性能影响,大表会产生短暂元数据锁。
  • 全局开启元数据查询自动刷新统计:如果有全局参数修改权限,执行SET GLOBAL innodb_stats_on_metadata = ON;,后续所有查询information_schema的操作都会自动拉取最新统计数据,无需手动执行ANALYZE TABLE,该配置会对高频查询系统表的场景带来轻微性能损耗,可按需调整。

查询语句示例:

SELECT 
    table_schema AS 数据库名,
    table_name AS 表名,
    ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 表大小_MB
FROM information_schema.TABLES
WHERE table_schema NOT IN ('information_schema','mysql','performance_schema','sys')
GROUP BY table_schema, table_name;

方案2:直接读取InnoDB内核页计数(实时性最高)

MariaDB 10.1.10已支持INNODB_SYS_TABLES和INNODB_SYS_INDEXES系统表,直接读取InnoDB内核维护的页计数计算表大小,无需依赖缓存的统计信息,实时性远高于方案1,无需修改参数也无需手动执行ANALYZE TABLE。

查询语句示例:

SELECT 
    SUBSTRING_INDEX(t.NAME, '/', 1) AS 数据库名,
    SUBSTRING_INDEX(t.NAME, '/', -1) AS 表名,
    ROUND(SUM(i.N_PAGES) * @@innodb_page_size / 1024 / 1024, 2) AS 表大小_MB
FROM information_schema.INNODB_SYS_TABLES t
INNER JOIN information_schema.INNODB_SYS_INDEXES i ON t.TABLE_ID = i.TABLE_ID
WHERE t.NAME NOT LIKE 'mysql/%' 
  AND t.NAME NOT LIKE 'information_schema/%'
GROUP BY t.NAME;

注意事项

  • 方案2统计的是表占用的物理页总大小,包含碎片和预留空间,和实际磁盘占用完全一致;如果需要统计有效数据大小,可将i.N_PAGES替换为i.N_PAGES - i.N_RESERVED计算。
  • 两种方案都无需SSH登录服务器,也无需安装Percona相关插件,完全适配MariaDB 10.1.10版本。

内容的提问来源于stack exchange,提问作者Wilson Edwards

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:54:03