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

如何高效查询『文章存档』

  •  
  •   zzlhr · 2018-02-01 08:48:49 +08:00 · 1303 次点击
    这是一个创建于 2469 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题如何高效的按照时间统计,文章在每个月的发表数量.

    5 条回复    2018-02-01 10:09:20 +08:00
    owenliang
        1
    owenliang  
       2018-02-01 08:57:59 +08:00 via Android
    发布一篇文章,就重算该月所有文章数量,更新数字。
    zzlhr
        2
    zzlhr  
    OP
       2018-02-01 09:21:48 +08:00
    @owenliang 单独建表存放每月的数量吗?
    CEBBCAT
        3
    CEBBCAT  
       2018-02-01 09:29:38 +08:00 via Android
    有数据库了是吗?那就添加一条递增记录呗,ID 相减再加一即为总数
    owenliang
        4
    owenliang  
       2018-02-01 10:00:48 +08:00   ❤️ 1
    @zzlhr

    1 )建归档表存每个月数量:month count。
    2 )建事件表用于触发更新:month。

    流程:

    在线部分:
    1 )增加 /删除文章,先插入一条事件记录:(2018 年 2 月份);若该步骤失败(数据库异常等),则中止后续流程,这叫做 WAL ( write ahead log )。
    2 )对文章表的各种操作...

    离线部分:
    1 )取事件表中的一批记录(比如 100 条)到内存,按 month 去重,通常来说只会剩下一个 month,因为发布的新文章都是当月的。
    2 )对于去重后的每个 month,去文章表执行 select count group by month,得到数量后更新到归档表对应 month 中。
    3 )删除已经处理的事件。

    该方案考虑了几个点:
    1 )文章并发新建 /删除,实时更新归档表存在老覆盖新的并发问题,所以选择走 WAL 事件异步串行化。
    2 )离线计算批量,解决文章并发量大,重复 count 的性能问题,因为基本上新文章都是当月的,可以批处理为 1 次 SQL 运算。
    3 )若上述串行离线处理方案存在瓶颈,建议换消息队列,按 month 分区,多消费者并行。
    zzlhr
        5
    zzlhr  
    OP
       2018-02-01 10:09:20 +08:00
    @owenliang 谢谢了,有灵感了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1244 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:15 · PVG 07:15 · LAX 15:15 · JFK 18:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.