首页 > 解决方案 > 如何使用简单的表列为海量价格数据规划 Timescaledb

问题描述

我正在尝试使用 timescaledb 来存储价格数据。价格表架构如下

CREATE TABLE prices(
  time TIMESTAMPTZ NOT NULL,
  pid  VARCHAR(1024) NOT NULL,
  price DOUBLE PRECISION NOT NULL
)

我们需要将价格数据保留最多 183 天。我们用于价格数据的当前数据库是 mongodb。我们在 mongodb 中已经有 90 亿条记录,在 183 天内插入和删除记录真的很慢。

查询非常简单。给定pid日期范围,例如 7das,查询返回一个包含平均价格、最高价格和最低价格的元组。查询的 RPS 约为 20。

此外,我们每天都会整理大约 3000 万条价格记录,这些记录将在每天凌晨 2 点左右插入到 mongodb。完成插入至少需要 4 小时。

为这样一个用例寻找和测试 timescaledb,我当然启用了 hyepertable 并设置了 24 小时的间隔块,并在pid. 这就是我迄今为止在 20 分钟内使用 python 完成插入 3000 万条记录所做的工作psycopg2.copy_from。想知道我在以最佳方式规划 timescaledb 方面遇到的案例还有哪些其他警告或建议?

ps 我确实尝试过 influxdb,但是当系列基数超过一百万左右时,它的表现并不好。

标签: pythonmongodbinfluxdbtimescaledb

解决方案


(时标联合创始人)

几点建议:

  1. 在 上创建复合索引pid, timestamp desc,而不仅仅是 pid。

https://blog.timescale.com/blog/use-composite-indexes-to-speed-up-time-series-queries-sql-8ca2df6b3aaa/

  1. 看看创建一个连续的聚合是否会对您的用例有所帮助。例如,类似:
  • CREATE VIEW prices_daily WITH (timescaledb.continuous) AS SELECT pid, time_bucket('1 day', time) AS bucket, min(prices) as min_price, max(price) as max_price FROM prices GROUP BY pid, bucket;

https://docs.timescale.com/latest/using-timescaledb/continuous-aggregates

  1. 探索使用压缩来减少存储并在较长时间内实现更快的扫描。特别是,鉴于您的查询通常是通过 pid,我可能会使用类似的东西:
  • ALTER TABLE 价格集 (timescaledb.compress, timescaledb.compress_segmentby = 'pid');

https://docs.timescale.com/latest/using-timescaledb/compression

另外,欢迎您加入 slack 上的 TimescaleDB 社区以解决这些类型的问题: https ://slack.timescale.com/


推荐阅读