本文从第一性原理出发,系统探讨了时序数据库的存储设计决策,包括行布局、压缩、分区策略,并通过 PostgreSQL 和 Parquet 实验量化评估了不同选择对成本和查询性能的影响。
📝 详细摘要
本文深入分析了时序数据存储的核心设计选择。文章首先定义了时序数据的结构(时间戳、维度、指标),并对比了关系型数据库中扁平化与规范化模式的存储开销与查询性能,通过实验证明规范化可减少约 42% 的存储空间。随后,文章探讨了高基数场景下规范化失效的问题,并介绍了使用 JSONB 字段进行模式演进的实用方案。文章重点对比了列式存储(Parquet)与行式存储(PostgreSQL)的优劣,指出列式存储通过字典编码等技术可实现极高的压缩比(实验中达 434 倍),并讨论了宽模式与窄模式的选择。最后,文章阐述了时间分区与二维分区(时间+空间)的策略,以及降采样与保留策略对控制成本的重要性,并分析了仪表盘刷新带来的读取放大效应及其缓解措施。
💡 主要观点
- 规范化存储可显著减少时序数据的存储开销,但在高基数场景下效果减弱。 通过将重复的维度信息提取到单独的序列表中,用较小的序列 ID 替代,可减少约 42%的存储空间。但当每个数据点都有唯一标识符时,规范化优势消失。
💬 文章金句
- 使用任何时序数据库都需要做出一系列的存储设计决策:如何布局行、何时进行压缩、基于什么进行分区。这些决策对成本和查询性能的影响,甚至比数据库本身的选择更为关键。
- 一个实用的原则是:将稳定的标识符放在维度中,将变化的测量值放在指标中。
- 列式存储将每一列集中存放。对于时序工作负载,即使采用比较扁平的逻辑模型,这种方法也能获得规范化带来的部分存储优势,因为重复维度的压缩效果良好,而且查询扫描的字节数更少。
- 时序写入具有一个特性:它们集中在“当下”这一时间点。每个活跃的时序都会将其最新数据点写入同一个当前时间窗口内。如果仅按时间进行分区,当前分区将吸收所有写入流量,而历史分区则处于闲置状态。
- 降采样是随着时间的推移降低数据分辨率,方法是预先计算更粗时间间隔的聚合数据。保留策略则规定了何时彻底丢弃数据。二者共同控制着存储成本的增长曲线。
📊 文章信息
AI 初评:88
来源:InfoQ 中文
作者:InfoQ 中文
分类:软件编程
语言:中文
阅读时间:30 分钟
字数:7280
标签: 时序数据库, 存储设计, PostgreSQL, Parquet, 数据分区