文档结构设计直接影响wiredtiger压缩效果,字段名缩写、使用timeseries集合、统一字段类型、避免稀疏字段、优先定长字段可提升20%–40%磁盘节省。

文档结构设计直接影响 WiredTiger 压缩效果,不改字段类型、不调压缩算法,仅靠结构调整就能提升 20%–40% 的磁盘节省。
字段命名越短,压缩率越高
WiredTiger 对 BSON 文档做块级压缩,字段名(key)参与压缩。重复出现的长字段名(如 user_profile_id、created_timestamp_utc)会显著拉低压缩率。
- 把
user_profile_id改成uid,created_timestamp_utc改成ts,实测在日志类集合中可降低约 15% 存储体积 - 避免使用嵌套过深的路径名,例如
metadata.device.info.os.version→ 可扁平化为os_ver - 注意:字段名缩写需在应用层统一维护,不能只靠 driver 或 schema 工具自动转换,否则易引发读写不一致
时间序列数据优先用 timeSeries 集合类型
普通集合对时间戳字段(如 timestamp: ISODate("..."))只能做通用压缩;而 timeSeries 集合启用列式存储 + 增量编码 + delta-of-delta,对单调递增的时间字段压缩率远超常规方式。
- 创建时必须指定
timeField和metaField,例如:db.createCollection("sensor_data", { timeseries: { timeField: "ts", metaField: "device_id", granularity: "seconds" } }) - 要求 MongoDB ≥ 5.0;5.2+ 自动启用
zstd列压缩,无需额外配置 - 已有数据无法直接转为 timeSeries,需导出 → 新建 → 重写导入,且
_id会丢失(WiredTiger 不保留原_id)
避免混合类型字段和稀疏数组
WiredTiger 对同一字段内类型不一致(如有时是 string,有时是 null 或 int)或数组元素类型杂乱([1, "abc", true])的文档,压缩效率急剧下降——因为无法有效利用字典或增量编码。
- 强制统一字段类型:用
0代替null表示缺失数值,用空字符串""代替null表示缺失文本 - 数组尽量存同构数据,例如传感器读数统一为
double,不要混入单位字符串;必要时拆分为values: [...]+unit: "celsius" - 稀疏字段(90% 文档为空)建议移出主文档,单独建关联集合,否则每个文档都带一个
null字段,白白占用 key 空间
固定长度字段比变长字段更利于压缩
虽然 MongoDB 本身不区分“定长/变长”语义,但实际压缩中,int、date、objectid 这类二进制长度固定的值,在 block 压缩阶段更容易被模式识别和去重;而 string、array 长度波动大,压缩器难以建立稳定字典。
- 时间戳优先用
ISODate(8 字节),不用字符串格式的"2026-07-07T10:34:00Z"(约 24 字节) - ID 类字段用
ObjectId,不用自增整数或 UUID 字符串(后者多出约 20 字节/条) - 枚举值用整数编码(
status: 1)代替字符串(status: "active"),配合应用层映射表
真正影响压缩率的从来不是“开了 zstd 就行”,而是字段怎么命名、时间数据是否走 timeSeries、null 怎么处理、以及有没有把能定长的全换成定长——这些细节在数据写入前就锁死了压缩上限,后期调参数基本无效。











