“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. 但这只是一个示例,您可以进一步使用它并根据需要进行调整。