如何优化‘SELECT FOUND_ROWS()’查询?每天都会有几个“高平均负载”警报

时间:2013-02-05 作者:Adam

我有5000个常规职位,一个职位类型有6000个职位,另一个职位类型有2000个职位。不用说,这使得wp_posts 桌子很大。更不用说,我已经设置了自定义分类法来模拟职位类型,因此对于输入公司职位类型的每个公司A,都有公司A,我手动将公司A输入公司分类法。这样,当我定期发布关于a公司的帖子时,我可以有效地tag 公司A进入帖子,然后该帖子出现在公司A的自定义帖子类型页面上。

Specs : 将WP Super Cache与Cloudflare一起作为CDN运行。主题是Wordpress TwentyEleven,但大量定制。Server: 2048 RAM,80gb Raid,8+CPU 4倍优先级,5000GB带宽。流量为750k次/月;20万uniques。

我开始看到性能问题迅速增加,在上周的两个例子中,我得到了

连接到数据库时出错

必须重新启动mysql服务。更不用说,高负载平均每天发送几次电子邮件。

已运行调试查询。使用WP超级缓存运行它。已卸载的WP超级缓存;已尝试启用大多数选项的W3 Total Cache。在两次测试中,我都看到了这两个查询导致的最长加载时间(但仅在第一次加载时!在后续加载时几乎为0):

Time: 7.79628753662E-5
Query: SELECT FOUND_ROWS()
Call from: require(\'wp-blog-header.php\'), require_once(\'wp-includes/template-loader.php\'), include(\'/themes/child-theme/index.php\'), WP_Query->__construct, WP_Query->query, WP_Query->get_posts, WP_Query->set_found_posts, W3_Db->query, W3_DbCache->query, W3_DbCallUnderlying->query, W3_Db->query, W3_DbProcessor->query, W3_Db->default_query

Time: 6.29425048828E-5
Query: SET SESSION query_cache_type = 0;
Call from: require(\'wp-blog-header.php\'), require_once(\'wp-includes/template-loader.php\'), include(\'/themes/child-theme/index.php\'), get_footer, locate_template, load_template, require_once(\'/themes/child-theme/footer.php\'), wp_footer, do_action(\'wp_footer\'), call_user_func_array, Debug_Queries->the_queries, Debug_Queries->get_queries, W3_Db->query, W3_DbCache->query, W3_DbCallUnderlying->query, W3_Db->query, W3_DbProcessor->query, W3_Db->default_query
我确实删除了一个数组,这样我们就可以在常规帖子之外查找帖子类型,但这似乎没有什么区别。

完整示例查询输出:http://pastebin.com/L0mSXe9q

此外,以下是主索引的模板代码:

    <?php if ( have_posts() ) : ?>

        <?php /* Start the Loop */ ?>

            <?php while ( have_posts() ) : the_post(); ?>

            <?php if ( \'status\' == get_post_format() ) {

                get_template_part( \'content-status\', get_post_format() );

            } else get_template_part( \'excerpt\', get_post_format() );

        ?>

        <?php endwhile; ?>
真的不知道该从哪里着手。

2 个回复
SO网友:WendiT

把这个放在你的函数里。php,你会没事的。

add_filter( \'pre_get_posts\', \'optimized_get_posts\', 100 );
function optimized_get_posts() {

    global $wp_query;

    $wp_query->query_vars[\'no_found_rows\'] = 1;

    return $wp_query;

}

SO网友:Philip

这不应中断分页:

add_filter(\'pre_get_posts\', \'optimized_get_posts\', 100);
function optimized_get_posts() {
    global $wp_query, $wpdb;
    $wp_query->query_vars[\'no_found_rows\'] = 1;
    $wp_query->found_posts = $wpdb->get_var( "SELECT COUNT(*) FROM wp_posts WHERE 1=1 AND wp_posts.post_type = \'post\' AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\')" );
    $wp_query->found_posts = apply_filters_ref_array( \'found_posts\', array( $wp_query->found_posts, &$wp_query ) );
    if($wp_query->query_vars[\'posts_per_page\'] <= 0) {
        $wp_query->max_num_pages = 0;
    } else {
        $wp_query->max_num_pages = ceil($wp_query->found_posts / $wp_query->query_vars[\'posts_per_page\']);
    }
    return $wp_query;
}

结束