Php 在针对随机记录的MySQL查询中,排除具有特定ID的记录的最有效方法是什么?
我有一个api端点,它从一个名为“posts”的表中返回X个数量的随机帖子。此端点由移动应用程序使用。它通过在posts表上执行SELECT COUNT(*)并返回表中的POST数量来检索随机POST。然后它进入一个for循环,在该循环中,在每个循环的开始处,生成一个从0到计数(*)的随机数。然后使用方便的偏移量获得一个随机柱。这个for循环一直持续到获得X个随机帖子的数量 伪代码:Php 在针对随机记录的MySQL查询中,排除具有特定ID的记录的最有效方法是什么?,php,mysql,random,notin,Php,Mysql,Random,Notin,我有一个api端点,它从一个名为“posts”的表中返回X个数量的随机帖子。此端点由移动应用程序使用。它通过在posts表上执行SELECT COUNT(*)并返回表中的POST数量来检索随机POST。然后它进入一个for循环,在该循环中,在每个循环的开始处,生成一个从0到计数(*)的随机数。然后使用方便的偏移量获得一个随机柱。这个for循环一直持续到获得X个随机帖子的数量 伪代码: FUNCTION getRandPosts : $numOfPosts = queryExecute("SEL
FUNCTION getRandPosts :
$numOfPosts = queryExecute("SELECT COUNT(*) from posts");
for (iterations < numOfRandomPostsNeeded) {
$randomNumber = rand(0, $numOfPosts)
$randomPost = queryExecute("SELECT * from posts LIMIT 1, OFFSET $randomNumber")
}
FUNCTION getRandPosts(STRING appInstallID) :
...
for ...
$randomPost = queryExecute("
SELECT posts.* FROM posts
JOIN seenPosts.postID FROM seenPosts
ON posts.id = seenPosts.postID
WHERE seenPosts.postID = null AND seenPosts.appInstallID = $appInstallID
LIMIT 1, OFFSET $randomNumber")
queryExecute("INSERT INTO seenPosts SET postID = $randomPost.id, appInstallID = $appInstallID")
...
考虑这样一种想法,即对于任何给定的用户,最多需要排除600篇文章(第一种想法是600个ID的数组)。为什么不直接使用
orderbyrand()LIMIT$numorandompostsneed
?您可以在一个查询中获得所需的随机帖子数量,而不需要重复。如果你随机查询一行600次,你会很快遇到性能问题。我听说使用RAND()效率很低。或者我太偏执了,过早地优化?过早。但我敢打赌,使用RAND once将比600个单一查询好599倍。运行多个查询将对性能产生更大的影响。每个查询都需要转到数据库,针对数据库运行并返回数据。不断地在数据库中查询一行,同时通过在id之后添加id来增加所述查询的复杂度,这不如对数据进行一次查询那么理想。也许我还应该指出,id不是连续的。可能会删除帖子,导致ID 278、279、281……这样的跳过。我想我读到了,这可能会导致兰德()运行缓慢。
FUNCTION getRandPosts(STRING appInstallID) :
...
for ...
$randomPost = queryExecute("
SELECT posts.* FROM posts
JOIN seenPosts.postID FROM seenPosts
ON posts.id = seenPosts.postID
WHERE seenPosts.postID = null AND seenPosts.appInstallID = $appInstallID
LIMIT 1, OFFSET $randomNumber")
queryExecute("INSERT INTO seenPosts SET postID = $randomPost.id, appInstallID = $appInstallID")
...