您更喜欢使用哪种方法查询用户社交媒体Feed中的下一组帖子?

时间:2016-05-12 20:25:17

标签: mysql innodb mariadb

上下文:

  • 这是一个Android应用程序
  • 每个用户都有帖子提要 - 想想推特
  • 我的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个帖子的额外尝试。

查询下一组的方法:

  1. 拥有唯一的auto_incrementing index列。所以为了查询接下来的四十个帖子我会用

    SELECT * FROM user_feed WHERE index< :post40Index LIMIT 40

  2. 这样做的问题是,每次将帖子或重新发布添加到index表时,user_feed都会递增。这意味着每次将帖子添加到用户的Feed时段。即使对于每个仅追随200人的5000名用户来说,这个数字似乎会很快增加。

    1. 与上述相同,但每个用户的Feed都有自己的增量列。我必须自己跟踪这个id。每当帖子被添加到特定用户的订阅源时,其摘要的最高索引号将被抓取,为该帖子设置,并递增以使下一个帖子没有相同的索引。 / LI>

      问题在于我觉得他们的解决方案更简单。

      1. 与两个相同,但是我会在内存列表中跟踪每个用户的最高索引,而不是user表中的列。

      2. 使用:

        SELECT * FROM user_feed WHERE date_created < :post40DateCreated LIMIT 40 并使用GET请求发送用户从第一个查询中收到的帖子的帖子ID,这些帖子具有与帖子40相同的date_created,并确保第二个查询不包含这些帖子ID - 添加post_id <> (post ids in request)到以上查询

      3. 有人认为他们有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

插入和删除都会导致用户看到的内容出现打嗝。另外,使用OFFSET

,性能可能很差,甚至很糟糕

是的,&#34;记住你离开的地方&#34;,并将其用于&#39; Next&#39;按钮,而不是&#34;页码&#34;。 date_created可以有重复的值吗?

查看我的Pagination, not with OFFSET, LIMIT