首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  数据库

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

  •  
  •   wuxqing · 2016-05-05 14:13:55 +08:00 · 510 次点击
    这是一个创建于 1313 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一张数据表,结构:
    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;

    效果差

    希望有经验的同学分享下思路:分表?索引?
    7 回复  |  直到 2016-05-09 10:48:17 +08:00
        1
    gao117348222   2016-05-05 14:52:52 +08:00
    这么大的数据不是应该是 mangodb 吗
        2
    dphdjy   2016-05-05 15:20:36 +08:00 via Android
    http://www.postgresql.org/docs/current

    100 亿~有点多。。。
        3
    9hills   2016-05-05 15:26:39 +08:00
    target_id 哈希拆表
        4
    lecher   2016-05-05 15:42:42 +08:00 via Android
    增加一个 ID 字段建索引,然后维护一个时间节点和 ID 的映射表,可以考虑按小时或者分钟建,就是大于等于时间 xxxxxx 的 ID=1100 。
    这样可以根据时间段取出范围的两个 ID ,之后快速根据 ID 取出一个时间段。
    性能肯定比时间比较好,但是查询硬是拆成两个,等于分表了。
        5
    zungmou   2016-05-05 19:56:38 +08:00
    以时间为单位分表,然后在该时间段区域内查询数据,会快很多的。
        6
    Aksura   2016-05-05 22:24:46 +08:00
    根据时间建成分区表,加索引。
        7
    wuxqing   2016-05-09 10:48:17 +08:00
    请教 pg 大牛后,大牛写的分析文章:
    https://yq.aliyun.com/articles/39680
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   929 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 21:58 · PVG 05:58 · LAX 13:58 · JFK 16:58
    ♥ Do have faith in what you're doing.