一、概述
项目在做设计的时候,通常有一个章节需要对数据库存储大小进行预估,包含每笔数据的存储大小、每一年的增长量以及五年后的存储大小。
每笔数据的大小,可以通过数据库表的设计进行估算。结合业务评估的每日业务笔数,计算出第一年需要的存储大小。再根据每年业务的增长量(通常也是由业务进行评估提供),依次算出后续5年每年所需要的存储大小。
基于以上的计算逻辑,技术方面最重要的就是评估每笔业务数据的存储大小。
二、MySQL字段类型
本次内容以MySQL为例来进行说明,其主要数据占用的存储如下:
1. 字符
- char(n): UTF8编码最大长度是3n,UTF8MB4则是4n
- varchar(n):UTF8编码最大长度是3n+2,UTF8MB4则是4n+2
MySQL5.0.3版本之后的字符长度定义的是字符的长度,而不是字节的长度。
varchar(n) 列显示的存储需要比实际字符要多 1 或者 2,这是因为 varchar 类型要用一个到两个字节来记录字节长度,如果 n < 255 时,用一个字节记录,n > 255 时,使用两个字节记录
2. 数值类型
- TINYINT: 1字节
- SMALLINT:2字节
- MEDIUMINT:3字节
- INT:4字节
- BIGINT:8字节
3. 时间类型
- DATE:3字节
- TIMESTAMP:4字节
- DATETIME:8字节
4. 浮点类型
- FLOAT: 4字节
- DOUBLE:8字节
- DECIMAL(M,D): M+2字节
如上加粗字体是日常项目中常用的数据类型。
三、估算
新建如下表,进行估算。
根据字段类型可得出每行数据最大的字节约为
8+4*100+1+4*2+8 = 425 byte
加上数据库的一些额外开销,比如索引、内部的实现和配置,假设一个固定值进行估算,每条数据额外加上20字节。所以一条数据是
435+20=455 byte
假设一天的业务数据量为1w笔,那么一年的存储如下:
455*10000*365=1660750000字节,差不多是1583MB一年。
四、参考信息
参考资料: