V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
schezuk
V2EX  ›  程序员

每页有 30 个帖子,逐一取最近 20 条回复,怎样效率最高?

  •  
  •   schezuk · 2015-03-05 22:08:41 +08:00 · 2614 次点击
    这是一个创建于 3552 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个访问频率非常高的版面,每页显示30个帖子,每个帖子都要按时间顺序显示最近的20条回复。表结构如下:

    表A储存帖子,主键`ID`,字段`LAST_REPLIES`,字段`CONTENT`(`LAST_REPLIES`存储最近20条回复)
    表B储存回复,主键`ID`,降序索引(`PARENT`,`TIME`),字段`CONTENT`(`PARENT`是被回复帖的ID)
    

    我目前有三个想法

    一个是从这30个帖子中取LAST_REPLIES,一共600个,然后

    SELECT * FROM `B` WHERE `ID` IN (####一共六百条ID####)
    

    另一个是从最近30个帖子中中取THREAD_ID,一共30个,然后

    SELECT * FROM `B` WHERE `PARENT` = :ID01 ORDER BY `TIME` DESC LIMIT 0,20
    UNION ALL
    SELECT * FROM `B` WHERE `PARENT` = :ID02 ORDER BY `TIME` DESC LIMIT 0,20
    UNION ALL
    SELECT * FROM `B` WHERE `PARENT` = :ID03 ORDER BY `TIME` DESC LIMIT 0,20
    UNION ALL
    ...... ......
    SELECT * FROM `B` WHERE `PARENT` = :ID30 ORDER BY `TIME` DESC LIMIT 0,20
    

    再一个也取THREAD_ID,语句是 [注意降序索引(PARENT,TIME)]

    SET @NUM := 0, @PARENT := 0;
    SELECT * , 
        @NUM := if(@PARENT = `PARENT`, @NUM + 1, 1) as "COUNT", 
        @PARENT = `PARENT` AS "DUMMY"
    FROM `B` FORCE INDEX(`PARENT`)
    GROUP BY `PARENT`
    HAVING @NUM <= 20
    WHERE `PARENT` IN (####一共三十条ID####)
    

    哪个效率最高?可以怎么优化?有没有效率更高的处理办法?

    版面结构不可修改(必须是30个帖子共600条回复)。表结构可以修改。

    3 条回复    2015-03-06 22:06:07 +08:00
    schezuk
        1
    schezuk  
    OP
       2015-03-06 20:23:04 +08:00
    唔……
    juxingzhutou
        2
    juxingzhutou  
       2015-03-06 22:04:22 +08:00
    不是很懂数据库,提个设想,请指正:每个帖子的回复单独建一张表?
    juxingzhutou
        3
    juxingzhutou  
       2015-03-06 22:06:07 +08:00
    是不是数据库的索引其实已经有我上面说的这个效果了?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1056 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:14 · PVG 07:14 · LAX 15:14 · JFK 18:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.