Php 需要有有效方法的指导才能获取所有新闻

Php 需要有有效方法的指导才能获取所有新闻,php,mysql,laravel,Php,Mysql,Laravel,假设一个用户正在跟踪成千上万的其他人 这些人定期发送新闻,在他/她的页面中,我们的用户只想看到这些人最近的新闻(分页) 最有效的方法是什么 这就是我目前正在做的: 在数据库中创建一个名为following的表,每个following都添加到这里,id,user\u id,following\u id 获取用户的以下\u用户\u ID的列表 获取(…在用户id之后…)中用户id(新闻海报id)所在的所有新闻 例如,如果我们的用户id为1: SELECT `following_user_id` FR

假设一个用户正在跟踪成千上万的其他人

这些人定期发送新闻,在他/她的页面中,我们的用户只想看到这些人最近的新闻(分页)

最有效的方法是什么

这就是我目前正在做的:

  • 在数据库中创建一个名为
    following
    的表,每个following都添加到这里,
    id
    user\u id
    following\u id
  • 获取用户的以下\u用户\u ID的列表
  • 获取(…在用户id之后…)中
    用户id
    (新闻海报id)所在的所有新闻
  • 例如,如果我们的用户id为1:

    SELECT `following_user_id` FROM `following` WHERE `user_id` = 1; /* This is used in the IN() below */
    
    SELECT * FROM `news` WHERE `user_id` IN (4,11,7,...following_user_ids....) ORDER BY `id` DESC limit 50 offset 0
    
    /* Of course the `user_id` is indexed in the `news` table */
    
    但是如果用户正在跟踪成千上万的人,并且
    新闻
    表格很大,我假设(…数千个ID…中的
    会非常慢

    那么,有没有更有效的方法

    编辑:
    如果任何人也有此问题,请坚持使用In方法,它比我的情况下的JOIN快得多。

    您可以使用“limit”功能限制搜索,每次用户需要更多信息时都需要更新该功能:

      LIMIT [offset,] row_count;
    
    将其放在示例中类似于这样,将此select保存在临时表变量中:

      SELECT * FROM `following_user_ids` ORDER BY `id` DESC limit rowcount offset offset_variable;
    

    如果你想在社交媒体的例子中,你可以在用户每次要求更多帖子时更新限制,这样用户就可以看到以下几个帖子。

    你可以使用“限制”功能限制搜索,用户每次需要更多信息时都需要更新该功能:

      LIMIT [offset,] row_count;
    
    select
        news.*
    from
        news
        join following on news.user_id=following.following_user_id
    where
        following.user_id=1
    
    将其放在示例中类似于这样,将此select保存在临时表变量中:

      SELECT * FROM `following_user_ids` ORDER BY `id` DESC limit rowcount offset offset_variable;
    

    如果您想以社交媒体为例,您可以在用户每次要求更多帖子时更新限制,以便用户能够看到他所关注的几个帖子。

    分页

    select
        news.*
    from
        news
        join following on news.user_id=following.following_user_id
    where
        following.user_id=1
    
    偏移量
    有问题。当他向前/向后翻页,其他人插入新行时,他将错过故事或在连续页面上看到同一故事两次

    解决办法是“记住你从哪里停下来的”。更多:

    加入

    JOIN
    方法更简洁,但不一定更快。无论哪种情况,最终的结果都是一大堆故事,而他只对一页的价值感兴趣。把剩下的铲来铲去是很昂贵的

    解决方法是只查找故事的ID,同时查找页面的价值。然后(通过另一个
    JOIN
    )查找每个故事的其余数据

    预构建列表

    尽管如此,如果有数千人(或者特朗普的数百万追随者)被跟踪,代价将相当高昂。有一种技术可以使
    SELECT
    更快,但代价是
    insert
    需要运行并存储信息

    有一个新的三列表:(1)follower_id,(2)timestamp,(3)story_id。每当发布一个故事时,每个follower都会向该表中添加一行。当一个追随者想要最新的故事时,他就在这张桌子上(或者至少ID是)


    更多信息:分页

    偏移量
    有问题。当他向前/向后翻页,其他人插入新行时,他将错过故事或在连续页面上看到同一故事两次

    解决办法是“记住你从哪里停下来的”。更多:

    加入

    JOIN
    方法更简洁,但不一定更快。无论哪种情况,最终的结果都是一大堆故事,而他只对一页的价值感兴趣。把剩下的铲来铲去是很昂贵的

    解决方法是只查找故事的ID,同时查找页面的价值。然后(通过另一个
    JOIN
    )查找每个故事的其余数据

    预构建列表

    尽管如此,如果有数千人(或者特朗普的数百万追随者)被跟踪,代价将相当高昂。有一种技术可以使
    SELECT
    更快,但代价是
    insert
    需要运行并存储信息

    有一个新的三列表:(1)follower_id,(2)timestamp,(3)story_id。每当发布一个故事时,每个follower都会向该表中添加一行。当一个追随者想要最新的故事时,他就在这张桌子上(或者至少ID是)


    更多信息:

    这是。。。不是他问的……这是一种解决问题的方法谢谢你的回复,但我的查询已经有了限制(
    limit 50 offset 0
    ),你可能错过了。我更担心()中的
    部分变得太长。但是,你也可以对关注者使用限制,更改偏移量和行数,但是如果有人请求新的帖子,你必须用这些变量的不同值更新搜索。这不是最好的方法,但这是一种更快的方法。这是。。。不是他问的……这是一种解决问题的方法谢谢你的回复,但我的查询已经有了限制(
    limit 50 offset 0
    ),你可能错过了。我更担心()中的
    部分变得太长。但是,你也可以对关注者使用限制,更改偏移量和行数,但是如果有人请求新帖子,你必须用这些变量的不同值更新搜索。这不是最好的方法,但这是一个更快的例子。这基本上是一个教科书上的加入案例。如果你不知道它们是如何工作的,可以搜索一下。它是任何基于SQL的数据库的基础,有成千上万的教程。@Vilx这样的东西会更快吗<代码>在news.user\u id=following.following\u user\u id(其中following.user\u id=1)上从新闻中选择*加入following速度取决于许多因素。您肯定需要将索引添加到所有