3. 因子库存储引擎选型:关系型数据库 vs 列式存储 vs 内存数据库
排放因子库的存储引擎选择直接决定了碳足迹数据刷新的吞吐量与响应延迟。在生产环境中,我们通常在三类引擎中做技术选型:关系型数据库(PostgreSQL / MySQL)、列式存储(ClickHouse) 与 内存数据库(Redis)。三类引擎在数据模型、写入模式、查询特征与扩展能力上存在本质差异,下面从碳足迹场景出发进行系统对比。
3.1 三类引擎的核心差异
| 对比维度 | PostgreSQL / MySQL | ClickHouse | Redis |
|---|---|---|---|
| 存储模型 | 行式存储,支持 ACID 事务 | 列式存储,面向分析查询 | 键值 / 数据结构存储,全内存 |
| 典型场景 | 因子元数据管理、版本控制、事务写入 | 大规模因子批量刷新、聚合查询 | 高频因子缓存、实时计算中间结果 |
| 写入吞吐 | 中等(单机约 1~5 万行/秒) | 高(单机可达 50~200 万行/秒) | 极高(单机可达 10~100 万 ops/秒) |
| 查询延迟 | 毫秒~秒级(依赖索引) | 亚秒~秒级(列裁剪 + 向量化) | 微秒~毫秒级(纯内存) |
| 数据持久化 | 强持久化(WAL + 复制) | 持久化(MergeTree 引擎) | 弱持久化(RDB / AOF,需配置) |
| 扩展方式 | 主从复制 / 分片(需中间件) | 原生分布式(分片 + 副本) | 集群分片(Redis Cluster) |
选型要点: 如果因子库需要频繁更新单条因子记录并保证事务一致性,优先选 PostgreSQL;如果每日批量刷新千万级因子行且需要快速聚合,选 ClickHouse;如果只缓存热点因子或做实时计算加速,选 Redis。
3.2 存储引擎架构对比
下图展示了三类引擎在排放因子库中的典型部署位置与数据流向。关系型数据库作为因子元数据的主存储,ClickHouse 承担批量刷新后的分析查询,Redis 则作为热数据缓存层。
3.3 关系型数据库:PostgreSQL vs MySQL
在关系型数据库内部,PostgreSQL 与 MySQL 在因子库场景下的差异主要体现在以下方面:
- JSON / JSONB 支持: PostgreSQL 的 JSONB 支持索引与内部字段查询,适合存储因子来源、置信度、区域标签等半结构化元数据;MySQL 的 JSON 类型功能较弱。
- 并发控制: PostgreSQL 使用 MVCC 实现高并发读写,不会出现写阻塞读;MySQL InnoDB 也使用 MVCC,但在高并发写入时间隙锁冲突更频繁。
- 分区表: PostgreSQL 支持声明式分区(范围、列表、哈希),适合按因子类型或区域做分区裁剪;MySQL 分区功能相对有限。
- 扩展性: PostgreSQL 支持外部数据包装器(FDW),可直接查询 ClickHouse 或 Redis 中的数据;MySQL 的联邦引擎使用较少。
推荐: 如果因子库需要复杂的自定义类型、JSON 元数据查询或跨引擎联邦查询,优先选 PostgreSQL;如果团队更熟悉 MySQL 生态且因子模型简单,选 MySQL 也能满足需求。
3.4 列式存储 ClickHouse 在因子刷新中的优势
ClickHouse 的列式存储与向量化执行引擎使其在批量因子刷新场景中具备显著优势:
- 列裁剪: 查询只读取涉及的列,避免读取整行数据。例如计算“电力排放因子平均值”时只需读取
factor_value一列。 - 数据压缩: 同列数据类型一致,压缩比可达 5~10 倍,减少 I/O 开销。
- 向量化计算: CPU 一次处理一批数据(如 1024 行),而非逐行处理,适合大规模聚合。
- MergeTree 引擎: 数据按主键排序后分区存储,批量插入后后台合并,写入吞吐极高。
-- ClickHouse 创建因子表的典型 DDL
CREATE TABLE emission_factors (
factor_code String,
factor_name String,
factor_value Float64,
unit String,
source String,
region String,
valid_from Date,
valid_to Date
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(valid_from)
ORDER BY (region, factor_code)
SETTINGS index_granularity = 8192;
3.5 内存数据库 Redis 的缓存加速策略
Redis 在因子库中主要承担热数据缓存与实时计算加速角色,典型使用模式包括:
| 缓存模式 | 数据结构 | 适用场景 | TTL 策略 |
|---|---|---|---|
| 因子值缓存 | String(JSON 序列化) | 高频查询的单个因子值 | 5~30 分钟 |
| 因子列表缓存 | Hash(field=因子编码,value=因子值) | 按区域或类型批量获取因子 | 10~60 分钟 |
| 计算结果缓存 | String / Sorted Set | 碳足迹预计算结果 | 1~24 小时 |
| 分布式锁 | String(SET NX EX) | 因子刷新任务互斥 | 任务完成后主动删除 |
注意: Redis 的持久化能力较弱,不应作为因子库的主存储。如果 Redis 宕机导致缓存丢失,应用层必须能从关系型数据库或 ClickHouse 重新加载数据。
3.6 混合存储架构推荐
在生产级排放因子库中,我们推荐采用三层混合存储架构:
实践建议: 因子元数据的写入与更新走 PostgreSQL;每日批量刷新任务将结果写入 ClickHouse;碳足迹计算应用优先查询 Redis 缓存,未命中时回源到 ClickHouse 或 PostgreSQL。三层之间通过消息队列或定时任务同步,避免强耦合。