加快大型数据库的分页速度

时间:2017-01-24 作者:themich

我们有一个wordpress,有100万个产品帖子和15000个分页页面,我们优化了所有网站,性能良好,但我们检测到wordpress上的存档分页速度很慢,我在存档页面上的查询示例如下:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts 
WHERE 1=1 
AND wp_posts.post_type = \'prod_bb\'
AND (wp_posts.post_status = \'publish\'
OR wp_posts.post_status = \'private\') 
ORDER BY ID
LIMIT 1043000, 70
这个查询并没有优化到可以推断70个帖子扫描了整个数据库,经过一些研究,我们发现了一篇关于wordpress.com, 如何管理分页

但尝试进行一些测试时,我无法运行代码,这是我实现的测试代码:

<?php 
// Start with 0
$last_id = 0;

do {
    $blogs = $wpdb->get_results( $wpdb->prepare(
        "SELECT  wp_posts.ID
FROM wp_posts 
WHERE 1=1 
AND wp_posts.post_type = \'prod_bb\'
AND (wp_posts.post_status = \'publish\'
OR wp_posts.post_status = \'private\') 
AND wp_posts.ID > %d LIMIT 70;",
        $last_id // Use the last ID to start after
    ) );

    foreach ( $blogs as $blog ) {
        // Do your thing!
  //  get_template_part( \'template-parts/content-index\', get_post_format() );

        // ...
        // Record the last ID for the next loop
        $last_id = $blog->wp_posts.ID;
    }
// Do it until we have no more records
} while ( ! empty( $blogs ) );
 ?>
有了这段代码,我的服务器的cpu达到了100%,它仍处于加载状态,没有显示任何内容

1 个回复
SO网友:Honza

wordpress上的这篇文章很有趣,也很真实,但我不知道它的目的是什么。提供的代码适用于您希望为每个帖子执行某些操作的情况;它不能直接在站点上分页。

你可以试试https://wpartisan.me/tutorials/wordpress-database-queries-speed-sql_calc_found_rows 相反,如果有一百万篇帖子,最好是彻底重新考虑分页;“限制1043000,70”是非常低效的部分。

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请