V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
skyangel3
V2EX  ›  问与答

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

  •  
  •   skyangel3 · 2013-02-19 08:50:38 +08:00 · 4853 次点击
    这是一个创建于 4299 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是不是在post 这个数据表中用一个column来记录 ,然后每次都+1如果有人回复的话 特别是回复数, 不是做"select COUNT(*) from comment where post.id = post"的吧?

    如果用上面的这个Query, 是不是特别慢??
    第 1 条附言  ·  2013-02-19 10:41:35 +08:00
    还有像那些流行的程序, disucz, phpwind, phpbb是怎么处理的, 不想自己去看, 大家知道的话, 告诉我一下
    7 条回复    1970-01-01 08:00:00 +08:00
    qichunren
        1
    qichunren  
       2013-02-19 10:13:42 +08:00   ❤️ 1
    posts表中加一个comments_count作cache,create comments和destroy comments时更新comments_count
    ipconfiger
        2
    ipconfiger  
       2013-02-19 10:22:57 +08:00   ❤️ 1
    当浏览量上来后POSTS表会成为热表,频繁的update会频繁的锁行(如果你是INNODB的话),而且MySQL在锁行的时候还会所附近的行,然后就会经常的锁冲突,超时。
    建议存在缓存里,比如memcache,然后定义的更新最新值到数据库用来记录的列,而不要直接频繁的去update
    skyangel3
        3
    skyangel3  
    OP
       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
        4
    ipconfiger  
       2013-02-19 10:43:44 +08:00
    @skyangel3
    首先肯定是 select post.count from post where id = id 快。纯读取的话,但是你得考虑更新的问题,频繁update带来的问题很大,如果这样做可以被人很快刷死你的系统,所以需要用缓存或者是通过队列来降低更新频率防止锁冲突造成的性能恶化
    rqrq
        5
    rqrq  
       2013-02-19 12:16:24 +08:00
    不想自己看,我也不想说
    skyangel3
        6
    skyangel3  
    OP
       2013-02-19 13:50:47 +08:00
    这不是交流网站吗?

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

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

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

    另外,select count (*) 这种查询的效率问题是老生常谈了,尽量避免 。要用的时候请用 select count(具体字段)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3257 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:29 · PVG 20:29 · LAX 04:29 · JFK 07:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.