如何高效的从海量数据中获取某段时间内的最新数据?

2016-05-05 14:13:55 +08:00
 wuxqing
有一张数据表,结构:
CREATE TABLE target_position (
target_id varchar(80),
time bigint,
content text
);

数据量(单表)是 20-100 亿条
target_id 大约 20 万个

数据库使用的是 PostgreSQL

需求:
查询每个目标指定时间段的最新一条数据。

现在是使用窗口函数来实现,如下:
select target_id,time,content from (select *,row_number() over (partition by target_id order by time desc) rid from target_position where time>开始时间 and time<=结束时间) as t where rid=1;

效果差

希望有经验的同学分享下思路:分表?索引?
1183 次点击
所在节点    数据库
7 条回复
gao117348222
2016-05-05 14:52:52 +08:00
这么大的数据不是应该是 mangodb 吗
dphdjy
2016-05-05 15:20:36 +08:00
http://www.postgresql.org/docs/current

100 亿~有点多。。。
9hills
2016-05-05 15:26:39 +08:00
target_id 哈希拆表
lecher
2016-05-05 15:42:42 +08:00
增加一个 ID 字段建索引,然后维护一个时间节点和 ID 的映射表,可以考虑按小时或者分钟建,就是大于等于时间 xxxxxx 的 ID=1100 。
这样可以根据时间段取出范围的两个 ID ,之后快速根据 ID 取出一个时间段。
性能肯定比时间比较好,但是查询硬是拆成两个,等于分表了。
zungmou
2016-05-05 19:56:38 +08:00
以时间为单位分表,然后在该时间段区域内查询数据,会快很多的。
Aksura
2016-05-05 22:24:46 +08:00
根据时间建成分区表,加索引。
wuxqing
2016-05-09 10:48:17 +08:00
请教 pg 大牛后,大牛写的分析文章:
https://yq.aliyun.com/articles/39680

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/276510

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX