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

2018-02-01 08:48:49 +08:00
 zzlhr

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

1228 次点击
所在节点    数据库
5 条回复
owenliang
2018-02-01 08:57:59 +08:00
发布一篇文章,就重算该月所有文章数量,更新数字。
zzlhr
2018-02-01 09:21:48 +08:00
@owenliang 单独建表存放每月的数量吗?
CEBBCAT
2018-02-01 09:29:38 +08:00
有数据库了是吗?那就添加一条递增记录呗,ID 相减再加一即为总数
owenliang
2018-02-01 10:00:48 +08:00
@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
2018-02-01 10:09:20 +08:00
@owenliang 谢谢了,有灵感了

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

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

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

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

© 2021 V2EX