上下文:
user_feed
表存储在MariaDB
数据库InnoDB
存储引擎 user_feed
表:
CREATE TABLE `user_feed` (
`user_id` int(1) unsigned NOT NULL,
`post_id` int(1) unsigned NOT NULL,
`reposter_id` int(1) unsigned DEFAULT NULL,
`date_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`user_id`,`post_id`),
KEY `user_id` (`user_id`),
KEY `date_created` (`date_created`),
KEY `post_id` (`post_id`),
KEY `reposter_id` (`reposter_id`),
CONSTRAINT `user_feed_ibfk_1` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `user_feed_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
现在我使用此SQL查询来获取用户的提要:
SELECT * FROM user_feed WHERE user_id = 29 ORDER BY date_created DESC LIMIT 40
我需要一个查询来获取user_feed
表格中的下一组40个帖子,但问题是帖子40和帖子41可能同时插入,对帖子也是如此39,42等
另一个问题是我无法使用LIMIT 41,80
因为当用户需要接下来的40个帖子时,可能会有更多帖子添加到他们的Feed中,因此他们从第一个查询收到的第40个帖子可能不会是查询结果中第40个帖子的额外尝试。
查询下一组的方法:
拥有唯一的auto_incrementing index
列。所以为了查询接下来的四十个帖子我会用
SELECT * FROM user_feed WHERE index< :post40Index LIMIT 40
这样做的问题是,每次将帖子或重新发布添加到index
表时,user_feed
都会递增。这意味着每次将帖子添加到用户的Feed时段。即使对于每个仅追随200人的5000名用户来说,这个数字似乎会很快增加。
问题在于我觉得他们的解决方案更简单。
与两个相同,但是我会在内存列表中跟踪每个用户的最高索引,而不是user
表中的列。
使用:
SELECT * FROM user_feed WHERE date_created < :post40DateCreated LIMIT 40
并使用GET请求发送用户从第一个查询中收到的帖子的帖子ID,这些帖子具有与帖子40相同的date_created,并确保第二个查询不包含这些帖子ID - 添加post_id <> (post ids in request)
到以上查询
有人认为他们有更好的解决方案吗?
答案 0 :(得分:0)
插入和删除都会导致用户看到的内容出现打嗝。另外,使用OFFSET
。
是的,&#34;记住你离开的地方&#34;,并将其用于&#39; Next&#39;按钮,而不是&#34;页码&#34;。 date_created
可以有重复的值吗?