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
用户id
(新闻海报id)所在的所有新闻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代码>速度取决于许多因素。您肯定需要将索引添加到所有