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

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

  •  
  •   wuxqing · 2016-05-05 14:13:55 +08:00 · 1349 次点击
    这是一个创建于 3152 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一张数据表,结构:
    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
    gao117348222
        1
    gao117348222  
       2016-05-05 14:52:52 +08:00
    这么大的数据不是应该是 mangodb 吗
    dphdjy
        2
    dphdjy  
       2016-05-05 15:20:36 +08:00 via Android
    http://www.postgresql.org/docs/current

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