我有4000多个帖子,质疑其中一些会不会导致性能问题?

时间:2014-05-17 作者:Tony Fire

我想知道如果查询这样的帖子:

    <?php $args = array(\'numberposts\' => 19, \'orderby\' => \'rand\' ); 
    $posts = get_posts( $args );
    foreach($posts as $post) {  
        $url = get_the_title($post->ID);
                echo \'<span class="url">\'.$image_url.\'</span>\';
                echo \'<span class="ID">\'.$post->ID.\'</span>\';  
    } 
    ?>
如果我的帖子超过4000篇,会导致性能问题吗?我不知道这个查询是如何工作的,但我想它的工作原理是检索所有4000篇帖子,将它们全部排序到随机位置,然后最后选择前19篇。这听起来有点重,所以我的问题是。

P、 4000多篇帖子听起来可能很多,但实际上它们只是带有空内容和标题中的href的链接帖子

EDIT: 答案的最终代码(未测试)

<?php

  $randposts = $wpdb->get_results( 
     "
     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
     "
 );

 foreach($randposts as $post) {  
     $url = get_the_title($post->ID);
     echo \'<span class="url">\'.$image_url.\'</span>\';
     echo \'<span class="ID">\'.$post->ID.\'</span>\';  
 } 
 ?>

2 个回复
最合适的回答,由SO网友:birgire 整理而成

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

SO网友:Tejaswini

get\\U posts在WordPress DB上作为单个SELECT查询执行。因此,从4000多篇文章中随机抽取19篇文章不会导致任何性能问题,这几乎类似于从100篇博文中抽取19篇文章。

结束