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

2015-03-05 22:08:41 +08:00
 schezuk

有一个访问频率非常高的版面,每页显示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条回复)。表结构可以修改。

2507 次点击
所在节点    程序员
3 条回复
schezuk
2015-03-06 20:23:04 +08:00
唔……
juxingzhutou
2015-03-06 22:04:22 +08:00
不是很懂数据库,提个设想,请指正:每个帖子的回复单独建一张表?
juxingzhutou
2015-03-06 22:06:07 +08:00
是不是数据库的索引其实已经有我上面说的这个效果了?

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

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

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

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

© 2021 V2EX