2.9 KiB
2.9 KiB
TimescaleDB 性能测试分析报告
基于 test_db.py 对 30 万条车辆仿真数据的写入与查询测试,本次性能评估结论如下:
1. 核心结论
TimescaleDB 完全满足智能电动车数字孪生系统(SmartEDT)的实时采集与回放需求。
- 写入能力:单线程下 3,500+ TPS 的写入速度远超单车采集需求(通常单车高频信号仅需 50-100Hz,即 50-100 TPS)。即使并发接入 10-20 台车,当前配置也绰绰有余。
- 查询响应:毫秒级(30ms) 的时间切片查询能力,保证了“前端实时回放”与“大屏曲线刷新”的流畅度,不会出现卡顿。
- 存储架构:JSONB 混合存储方案在保持了极高灵活性的同时(0.2s 过滤查询),依然维持了优秀的查询性能,验证了“结构化字段(索引)+ 半结构化 Payload(JSONB)”建模方案的正确性。
2. 详细指标分析
2.1 写入性能 (Insertion)
- 指标:3,547.78 条/秒 (TPS)
- 场景:单连接、Batch=1000、Python
asyncpg驱动。 - 分析:
- 满足度:假设单车采集频率为 50Hz(即每秒 50 个数据包),当前性能理论上可支持 70 台车同时在线采集。
- 瓶颈推测:当前瓶颈主要在 Python 端的序列化与网络 IO 往返(RTT)。
- 优化空间:如果未来需要支持上千台车,改用
COPY协议或增加并发写入 worker,吞吐量可轻松提升至 5-10 万 TPS 以上。
2.2 查询性能 (Query)
| 查询类型 | 耗时 | 业务场景 | 评价 |
|---|---|---|---|
| 最新数据 (Latest 1000) | 0.0301s | 实时大屏监控、轨迹回放 | 极优。利用 TimescaleDB 的时间分区索引,无论历史数据多大,提取“最新 N 条”永远是毫秒级。 |
| 全量计数 (Count) | 0.0845s | 报表统计、数据完整性校验 | 优秀。30万数据秒出,说明元数据管理高效。 |
| JSONB 内容过滤 | 0.2137s | 复杂故障诊断、特定工况筛选 | 良好。在没有对 JSON 内部字段建索引的情况下,0.2s 扫描 30 万条 JSON 数据属于高性能表现。 |
3. 架构建议
基于测试结果,对后续开发提出以下建议:
- 保持 JSONB 方案:当前的表结构(
ts,simulation_id,signals(JSONB))在性能与灵活性之间取得了完美平衡,无需拆分更多列。 - 索引优化:目前
ts和simulation_id已有索引。如果未来经常需要按“车速”或“故障码”过滤,建议对 JSONB 内部高频查询字段建立 GIN 索引。- 示例 SQL:
CREATE INDEX idx_speed ON vehicle_signals USING gin ((signals->'vehicle_speed_kmh'));
- 示例 SQL:
- 保留策略:建议配置 TimescaleDB 的
retention_policy,例如自动删除 30 天前的原始高频数据,只保留降采样后的聚合数据,以节省磁盘空间。