“Order By Rand()Alternative”方法,您可以查看this article 讨论如何在选择时优化SQL查询N
随机行。它被称为Rand()Alternative方法排序。
我已经用过了one of my previous answers.
据我所知,诀窍是引入一种特殊的WHERE
减速前减少行数的条件ORDER BY RAND()
踢进来。在您的情况下,可能是这样的:
WHERE RAND() < ( SELECT ( ( 19 / COUNT(1) ) * 10 ) FROM wp_posts )
在哪里
COUNT(1)
应快于
COUNT(*)
在InnoDB上。
可以通过修改从WP_Query()
, 通过posts_request
滤器
这可能只与4000个帖子无关,但在处理成千上万个帖子时可能有用。
为了回答您的问题,我建议您分析您的查询,有无随机排序,就像@Wyck在评论中建议的那样。
如果您使用numberposts
等于19,则只能从posts表中获取19行,而不是4000行。另一方面,如果numberposts
等于-1,则查询将获取整个表。
从get_posts( $args )
查询可能如下所示:
SELECT SQL_CALC_FOUND_ROWS wp_posts.*
FROM wp_posts
WHERE 1=1
AND wp_posts.post_type = \'post\'
AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\')
ORDER BY RAND() DESC
LIMIT 0, 19
其中参数
numberposts
(或
posts_per_page
) 和
paged
控制生成查询的限制部分。
如果要测试技巧,请尝试:
SELECT SQL_CALC_FOUND_ROWS wp_posts.*
FROM wp_posts
WHERE 1=1
AND wp_posts.post_type = \'post\'
AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\')
AND RAND() < ( SELECT ( ( 19 / COUNT(1) ) * 10 ) )
ORDER BY RAND() DESC
LIMIT 0, 19
例如,您可以使用以下方法显式测试限制:
SELECT wp_posts.*
FROM wp_posts
WHERE wp_posts.post_type = \'post\'
AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\')
AND RAND() < 0.0475
ORDER BY RAND() DESC
LIMIT 0, 19
在哪里
( 19 / 4000 ) * 10 ) = 0.0475
. 但这只是一个示例,您可以进一步使用它并根据需要进行调整。