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