有个快消品中小企业进销存SaaS系统需要跟踪租户的数据增长量并估算租户数据存储空间,数据增长量比较容易计算求数据表租户记录数变化量即可,但是估算租户数据存储空间却不是那么直接,需要一点小技巧。当时,估算Mysql存储空间用了2种方案:
1、根据表结构、记录数估算表存储空间
1)汇总数据表各字段类型所占字节大小,rowSize;
2)租户表空间 = rowSize * 租户记录数;
3)租户数据存储空间 = sum(租户所有表空间)
存在问题:
1)表结构各字段类型所占字节大小 * 租户记录数,并不能正确代表表存储空间,索引空间、页最小存储空间等没有考虑;
2)表结构有变化,需要更新元数据,否则表结构各字段类型所占字节大小求和不准确;
3)索引空间没考虑在内;
2、使用Mysql系统表,或show命令查看
以系统表为例,information_schema数据库tables数据表,关键字段如下:
TABLE_NAME | ENGINE | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | INDEX_LENGTH |
---|---|---|---|---|---|
base_goods | InnoDB | 1327 | 234 | 311296 | 180224 |
sale_account_discount_detail | InnoDB | 6235 | 254 | 1589248 | 671744 |
其中:
- TABLE_NAME:表名
- TABLE_ROWS:表记录数
- DATA_LENGTH:表数据存储空间
- INDEX_LENGTH:表索引存储空间
- 表所占空间 TABLE_LENGTH = DATA_LENGTH + INDEX_LENGTH
则租户表空间计算如下:
- TENANT_LENGTH = 租户表记录数/TABLE_ROWS * TABLE_LENGTH
- 租户存储空间 = sum(租户不同表的TENANT_LENGTH)
该方案优缺点:
- 优点:数据库自身功能,相对较准确,取数据快;
- 缺点:部分表空间计算,受表碎片影响,可能存在严重的虚大情况
综合上述2各方案,最终使用Mysql系统表来估算租户数据空间。