python - 如何使用简单的表列为海量价格数据规划 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,但是当系列基数超过一百万左右时,它的表现并不好。
解决方案
(时标联合创始人)
几点建议:
- 在 上创建复合索引
pid, timestamp desc
,而不仅仅是 pid。
- 看看创建一个连续的聚合是否会对您的用例有所帮助。例如,类似:
- 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
- 探索使用压缩来减少存储并在较长时间内实现更快的扫描。特别是,鉴于您的查询通常是通过 pid,我可能会使用类似的东西:
- ALTER TABLE 价格集 (timescaledb.compress, timescaledb.compress_segmentby = 'pid');
https://docs.timescale.com/latest/using-timescaledb/compression
另外,欢迎您加入 slack 上的 TimescaleDB 社区以解决这些类型的问题: https ://slack.timescale.com/
推荐阅读
- javascript - 为什么 while() 构造在 Chrome 调试器中可以正常工作,但在 jsbin 中却不能?
- c# - 如何编写类似于为依赖注入提供的扩展方法?例如:.AddTransient
()? - javascript - 使用 DOM 操作将 forEach 函数转换为 for 循环
- php - 确定子字符串是否属于字符串的运算符
- reactjs - 你如何映射一个数组并将每个数字分配给一个 div?
- inno-setup - 只允许运行一次 Inno Setup 安装程序
- c++ - 为什么使用共享库时对象和库的顺序不影响链接?
- rust - 256 位无符号整数数据类型
- neo4j - 使用 WebFlux 返回 Neo4j 地图投影
- uwp - 无法处理 WebView 导航