V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
sss007
V2EX  ›  数据库

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

  •  
  •   sss007 · Feb 1, 2018 · 1843 views
    This topic created in 3018 days ago, the information mentioned may be changed or developed.

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

    5 replies    2018-02-01 10:09:20 +08:00
    owenliang
        1
    owenliang  
       Feb 1, 2018 via Android
    发布一篇文章,就重算该月所有文章数量,更新数字。
    sss007
        2
    sss007  
    OP
       Feb 1, 2018
    @owenliang 单独建表存放每月的数量吗?
    CEBBCAT
        3
    CEBBCAT  
       Feb 1, 2018 via Android
    有数据库了是吗?那就添加一条递增记录呗,ID 相减再加一即为总数
    owenliang
        4
    owenliang  
       Feb 1, 2018   ❤️ 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 分区,多消费者并行。
    sss007
        5
    sss007  
    OP
       Feb 1, 2018
    @owenliang 谢谢了,有灵感了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   965 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 20:22 · PVG 04:22 · LAX 13:22 · JFK 16:22
    ♥ Do have faith in what you're doing.