你们在论坛程序中怎么记录帖子的浏览量和回复数 , 比如v2ex这个系统

2013-02-19 08:50:38 +08:00
 skyangel3
是不是在post 这个数据表中用一个column来记录 ,然后每次都+1如果有人回复的话 特别是回复数, 不是做"select COUNT(*) from comment where post.id = post"的吧?

如果用上面的这个Query, 是不是特别慢??
4884 次点击
所在节点    问与答
7 条回复
qichunren
2013-02-19 10:13:42 +08:00
posts表中加一个comments_count作cache,create comments和destroy comments时更新comments_count
ipconfiger
2013-02-19 10:22:57 +08:00
当浏览量上来后POSTS表会成为热表,频繁的update会频繁的锁行(如果你是INNODB的话),而且MySQL在锁行的时候还会所附近的行,然后就会经常的锁冲突,超时。
建议存在缓存里,比如memcache,然后定义的更新最新值到数据库用来记录的列,而不要直接频繁的去update
skyangel3
2013-02-19 10:35:28 +08:00
如果有10000个帖子的话, 缓存会消耗多大MB, 还有缓存这么多数据, 会不会有什么不好的地方, 如果重起主机的话, 第一次阅读会不会超级慢 ,

其实就是select COUNT(*) from comment where post.id = post 对比 select post.count from post where id = id 的速度由多大差距
@ipconfiger
ipconfiger
2013-02-19 10:43:44 +08:00
@skyangel3
首先肯定是 select post.count from post where id = id 快。纯读取的话,但是你得考虑更新的问题,频繁update带来的问题很大,如果这样做可以被人很快刷死你的系统,所以需要用缓存或者是通过队列来降低更新频率防止锁冲突造成的性能恶化
rqrq
2013-02-19 12:16:24 +08:00
不想自己看,我也不想说
skyangel3
2013-02-19 13:50:47 +08:00
这不是交流网站吗?

我又不是看不懂它们的代码, 只是不想花时间去下载代码, 然后寻找那一行代码, 有不是要大家帮我实现这个功能, 只是要你的IDEA Input而已, 为什么这么有敌意。
AntiGameZ
2013-02-19 14:02:28 +08:00
@skyangel3 你不想看,人家不想说,这很天经地义的吧?

像Discuz,它在Post上还有Thread这个表,把主题本身的回复数,查看数放到Thread表里记录。也就是说,作为楼主发帖时,数据库会创建一条Thread,一条Post记录(实际上没这么简单)。回贴的只是在同一个ThreadId下多给Post加了一条记录。总之,都会在某个表里,留下帖子的回复数和查阅数

数据量和访问量上来了,不管什么样的数据库结构,都会要用到cache。10000的帖子根本不叫数据量,何况缓存的时候,也没有人会所有信息连文字连图都缓存,挑一些信息出来呗。再说,如果真的是有10000个热帖非缓存不可,估计到时候你也不会为了这点小技术细节担心了吧:)

另外,select count (*) 这种查询的效率问题是老生常谈了,尽量避免 。要用的时候请用 select count(具体字段)

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

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

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

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

© 2021 V2EX