Doris、StarRocks都是兼容MySQL语法,所以这里介绍的获取表大小的 sql ,在Doris、StarRocks也有效

MySQL获取表的大小信息,需要查询 information_schema 库的 tables 表,这个表存放了关于数据库中所有表的元数据信息,里面有很多字段,大致可以分成三个类型

表基础信息:

  • TABLE_CATALOG:表所属的目录

  • TABLE_SCHEMA:表所属的数据库名称

  • TABLE_NAME:表名

  • TABLE_TYPE:表的类型,常见的有BASE TABLE(基础表)、VIEW(视图)等

表结构信息:

  • ENGINE:表使用的存储引擎,比如InnoDBMyISAM

  • VERSION:表的版本号

  • ROW_FORMAT:行格式,比如Compact、Dynamic等

  • TABLE_ROWS:表中的大致行数(有延迟)

  • AVG_ROW_LENGTH:平均每行数据的长度

  • DATA_LENGTH:表数据占用的字节数

  • MAX_DATA_LENGTH:表数据最大可能占用的字节数

  • INDEX_LENGTH:表索引占用的字节数

  • DATA_FREE:表中已分配但未使用的空间字节数

  • CREATE_TIME:表的创建时间

  • UPDATE_TIME:表的最后更新时间

  • CHECK_TIME:表的最后检查时间

  • TABLE_COLLATION:表的字符集和排序规则

  • CHECKSUM:表的校验和值

  • CREATE_OPTIONS:创建表时使用的其他选项

表权限信息:

  • GRANTOR:授予表权限的用户。

  • GRANT_DATE:权限授予的日期。

我们获取某个表的大小,取的就是 DATA_LENGTH 字段

SELECT table_name, data_length
FROM information_schema.tables 
WHERE table_schema = '库名' AND table_name = '表名'

这个字段表示的是表的字节大小,如果想直接转成用户友好的显示方式(自动显示B、KB、MB、GB、TB),可以程序上自己转换,也可以在 sql 中将换好

SELECT table_name,
       case
           when data_length > 1099511627776 then concat(round(data_length / 1099511627776, 2), 'TB')
           when data_length > 1073741824 then concat(round(data_length / 1073741824, 2), 'GB')
           when data_length > 1048576 then concat(round(data_length / 1048576, 2), 'MB')
           when data_length > 1024 then concat(round(data_length / 1024, 2), 'KB')
           else concat(data_length, 'B')
       end as data_length
FROM information_schema.tables
WHERE table_schema = '库名' AND table_name = '表名'