postgresql存储时序、轨迹数据

发布时间 2023-12-24 02:24:19作者: 许胜斌

需求

轨迹查询

查询车辆一天的指标(轨迹、速度)

业务:
1、一天有1800万条指标数据

2、多个指标要存储、指标随时增加

  • json类型

3、时序数据

技术要求:
1、

空间索引

查询一个区域内经过的车辆
技术要求:
1、一辆车一天的轨迹,存一行数据。从原始表进行汇总。
2、空间聚合函数。点可以以线串形式保存。划分时间间隔(如每15分钟创建一个线串),如果范围内没有点,就不生成线串。

  • 考虑轨迹飘逸(断)的问题。如果线串的长度大于几公里,就认为是飘逸数据。

dba群里问一下方案

参考资料

https://github.com/digoal/blog
https://www.cnblogs.com/88223100/p/PostgreSQL_real-time_position_tracking-trajectory_analysis_system_practice.html
https://github.com/digoal/blog/blob/master/201604/20160414_01.md?spm=a2c6h.12873639.article-detail.16.a9fd5f37wN8Sfy&file=20160414_01.md

postgresql 提供了块级索引(简称 BRIN),主要适用于类似时序数据之类的,有着天然的顺序,而且都是添加写的场景。相比于 btree 索引,它的体积小得多,非常适用于大数据量的场景。

表结构设计

原始点表

字段 类型
device_id string
time timestamp
metric jsonb {"speed": 1.0,"loc" : {1,2}} https://www.cnblogs.com/chenyablog/p/14647273.html

1、表根据timestamp字段进行分区,每天存储一个分区
2、字段device_id创建bree索引
3、字段time创建块索引

http://www.postgres.cn/docs/14/ddl-partitioning.html

  • 分区之后,索引是创建在分区表上的

轨迹表

字段 类型
device_id
date
geo geometry LINESTRING(0 0, 1 1,2 1,2 2)
customer_id 客户id

1、根据date进行分区存储
2、date字段创建bree索引
2、轨迹字段,创建空间索引

brew install pg

https://blog.csdn.net/kmust20093211/article/details/44359053

优化

1、date、customer_id进行分区
2、主键索引可以没有。

测试情况

  • 只insert
  • 关闭同步写入

image
image
一秒写入6万。
image

设想:
1、同时保留mongo和postgresql。 postgresql给用户使用,mongo给第三方,以及统计脚本使用。