如何为数以百万计的帖子优化WP网站

时间:2014-10-25 作者:Jeremiah Prummer

我正在为一家公司开发一个网站,该公司很可能会通过自定义帖子类型创建数百万篇帖子。他们是祈祷者,所以前端的用户基本上只是通过表单提交一个简短的短语。公司只关心帖子内容和发布日期。这个网站甚至还没有上线,他们已经有超过120000个帖子了,所以我说数百万的话是非常严肃的。

因此,有几个优化问题:

假设我在一个自定义帖子类型中有一个“特色”类别,有500000篇帖子。特色类别只有500篇帖子。如果我为特色帖子创建一个查询,我是查询整个500000篇帖子,还是仅查询500篇特色帖子?如果我只想显示最近发布的十篇文章,那该怎么办

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

1。在运行WP\\u query之前设置查询这似乎是在尽量减少数据库查询时要记住的最重要的事情,因为更改查询的唯一机会当然是在SQL数据库中运行之前。

Normal Queries
对于普通查询,WordPress使用wp() 函数,该函数依次调用$wp->main( $query_vars ). 条件标记中的“is\\uvariables”在传递给之前进行设置WP_Query->get_posts(), 它将其转换为MySQL数据库查询,并最终将其存储在$wp\\u查询对象中。可以在中实际运行查询之前对其进行筛选SQL database.

这个pre_get_posts 操作挂钩到此流程中,允许您在将查询传递给之前更改查询WP_Query->get_posts().

例如,如果要筛选“特色”类别中帖子的查询,可以使用add_action( \'pre_get_posts\', \'your_function_name\' ); 并包括in_category 内的条件标记your_function_name.

function your_function_name( $query ) {
    if ( $query->in_category( \'featured\' ) && $query->is_main_query() ) {
        // Replace 123 with the category ID of the featured category.
        $query->set( \'cat\', \'123\' );
    }
}
add_action( \'pre_get_posts\', \'your_function_name\' );
请参见Plugin API/Action Reference/pre get posts « WordPress Codex

Page Requests
对于页面模板,例如“特色”类别的存档页面,条件标记在pre_get_posts 滤器例如,您不能使用is_category 检查存档页,因为WP\\U查询尚未运行。

相反,您必须使用new WP_Query 看起来像是$query = new WP_Query( \'cat=123\' );. 这将从一开始就使用适当的参数集运行查询。

看见Class Reference/WP Query « WordPress Codex

2。保存到数据库

您可以使用过滤器wp_insert_post_data 确保仅将与自定义帖子类型相关的$数据返回到wp_insert_post. 请确保包含条件语句以检查自定义帖子类型
Plugin API/Filter Reference/wp insert post data « WordPress Codex

此挂钩由wp_insert_post 函数,该函数由调用wp_update_post 更新自定义帖子类型时,通常通过保存草稿或发布帖子。

不过,您必须自己进行基准测试,因为我个人无法谈论减少数据库中更新的数据的优化意义。

3。自定义帖子类型是否会影响性能

根据我的经验,自定义帖子类型是管理内容的强大工具。我不知道还有什么其他方法可以以它允许的所有方式来管理帖子,从而使用更少的资源。我个人将集中精力寻找尽可能减少查询数量的方法。

以前,permalink结构存在一个性能问题,导致它在以文本而不是数字开头时受到攻击。3 这对于承载大量页面的站点来说尤其麻烦,但自WordPress版本3.3以来就已经解决了。

我在这里只提到permalinks,因为slug通常是permalink结构的第一部分,它可能会也可能不会影响3.3版之前的性能。除此之外,我不知道使用自定义帖子类型会产生任何性能问题。

其他性能选项

Transients
这并不能替代将查询保持在代码中的最小值,但您可以使用set_transient 将查询存储一段时间,以便不需要新查询。以下是中使用的示例Dave Clements\' post. 此外,请注意,他建议添加save_post 在更新给定post类型时删除瞬态的操作。

<?php // IN THE SPOTLIGHT QUERY
if( false === ( $its_query = get_transient( \'its_query\' ) ) ) {
    $pttimestamp = time() + get_option(\'gmt_offset\') * 60*60;
    $its_query = new WP_Query( array(
        \'post_type\' => \'spotlight\',
        \'posts_per_page\' => 1,
            \'post__not_in\' => $do_not_duplicate,
        \'meta_query\' => array(
            array(
                \'key\' => \'_hpc_spotlight_end_time\',
                \'value\' => $pttimestamp,
                \'compare\' => \'>\'
            )
        )
    ) );
    set_transient( \'its_query\', $its_query, 60*60*4 );
}
if( have_posts() ) { // HIDE SECTION IF NO CURRENT ITS FEATURE ?>
    // LOOP GOES HERE: NOT IMPORTANT TO EXAMPLE
<?php } ?>
More query optimization<托马斯·格里芬有一些好的建议Optimize WordPress Queries 辅导的以下是他的建议列表:

设置\'cache_results\' => false 在一次性查询中,如果您的服务器未使用持久缓存(如Memcached)。一次性查询被描述为“用于显示少量数据的查询。可能是您只想显示与当前帖子相关的链接帖子标题,或者您可能想显示帖子下拉列表以选择特定选项设置。”

他的例子:$query = get_posts( array( \'posts_per_page\' => 1, \'cache_results\' => false ) );

设置\'no_found_rows\' => true 不需要分页的位置。这将“绕过MySQL计算结果,看看是否需要分页”

他的例子:$query = new WP_Query( array( \'posts_per_page\' => 1, \'no_found_rows\' => true ) );

仅当您只需要这些信息时,才查询帖子ID\'fields\' => \'ids\'在里面get_posts. 这将大大减少返回的数据量,如果您查看Database Description « WordPress Codex

他的例子:$query = get_posts( array( \'posts_per_page\' => 1, \'fields\' => \'ids\' ) );

除了最后一条提示,当您只需要一个或几个post字段时,可以使用get_post_field.

对查询的工作方式有一个坚实的理解是至关重要的。查询越具体,对SQL数据库的要求就越少。这意味着管理数据库查询的可能性很大。在自定义查询运行的地方一定要小心(是管理页面吗?),正确使用sanitization 在直接查询中,尝试使用本机WordPress函数,这样可以实现相同的性能。

SO网友:rigosan

我还补充道:

    \'no_found_rows\'          => true,
    \'update_post_term_cache\' => false,
    \'update_post_meta_cache\' => false,
    \'cache_results\'          => false
no\\u found\\u rows(布尔)-当您不需要任何分页,也不需要找到的帖子总数时,将其设置为真
  • cache\\u结果(布尔)-发布信息缓存
  • 更新\\u post\\u meta\\u缓存(布尔)-post meta information cache更新\\u post\\u term\\u缓存(布尔)-术语后信息缓存通过使用这些参数并将值传递为FALSE,我们可以通过停止执行一些额外的数据库查询来加快查询速度。

    注意:我们不应该总是使用这些参数,因为向缓存添加内容是正确的,但是这些参数在特定情况下可能有用,您应该在知道自己在做什么时考虑使用。

    请访问:https://drujoopress.wordpress.com/2013/06/27/how-to-optimize-wordpress-query-to-get-results-faster/#more-184

    SO网友:Mark Kaplun

    正如所有过早优化类型的问题一样,如果不知道确切的使用模式,就无法真正回答这一问题,因为很多时候,只有当您投入使用时,才会发现这些使用模式。

    一般来说,根据MYSQL规范,数据量应该没有任何问题。当然,即使使用最好的算法,搜索数据的速度也会比使用更小的表要慢,但解决方案是简单、更强的CPU。

    您可能希望优化元数据的存储方式(例如不存储ping相关的数据),但这类事情取决于您的具体操作,最终您可能仍然需要更强大的CPU,因此可能不值得您费心。

    结束

    相关推荐

    使用多个版本的jQuery,同时仍像WP Like那样使用它

    我的插件中有两个JS插件。一个使用jQuery 1.7.1,另一个使用jQuery 1.9.1。我需要让他们每个人使用不同的版本。这就是目前的情况:Plugin php file:wp_register_script(\'jq-1.9.1-js\', \'https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js\'); wp_enqueue_script(\'jq-1.9.1-js\'); wp_register_sc