优化对自定义字段的调用量

时间:2015-03-23 作者:luqo33

我的代码库中有以下代码片段:

    foreach($this->adverisers as $adveriser) {     

        $this->data[$adveriser->name][\'image\'] = bfi_thumb(get_post_meta($adveriser->ID, 
                                                            \'ss_advertisers_cats_image\', true ), 
                                                             $this->imgDimensions  
                                                           );  

        $this->data[$adveriser->name][\'description\'] = get_post_meta($adveriser->ID,
                                                        \'ss_advertisers_cats_description\', 
                                                         true 
                                                       );        

        $this->data[$adveriser->name][\'advertiser\'] = $wpdb->get_results( "SELECT DISTINCT * FROM {$wpdb->posts}
                                                              WHERE(post_type=\'brands\' OR post_type=\'boutiques\') 
                                                              AND post_author=\'{$adveriser->post_author}\' ", OBJECT 
                                                           ); 

        $this->data[$adveriser->name][\'advertiserRedirectionLink\'] = get_post_meta($adveriser->ID, 
                                                                      \'ss_advertisers_cats_link\', 
                                                                      true 
                                                                      ); 
}
循环将构建一个自定义数据数组,以便稍后在站点上显示。正如您所看到的,在循环的每个迭代中,总共有四个对数据库的查询。这可能远远不是最佳性能,因为在我看来,这是N+1 Query problem.

是否有任何简单的解决方案可以显著提高此代码的性能?或者,我唯一的选择是使用$wpdb 在一次/两次查询中获取所有必需的数据,或。。也许所呈现的代码并没有那么糟糕,也不会对性能造成太大的影响

2 个回复
SO网友:Pieter Goosen

这里我不太担心性能,但我会通过调用get_post_meta() 只有once. 这不会像我稍后链接到的帖子中所看到的那样提高或降低绩效,但归根结底,这取决于不重复自己的原则。

与您的想法相反,查询自定义字段是非常优化的,而且缓存速度非常快。你打不打电话都没关系get_post_meta() 一次或一百次,获取这些自定义字段的查询时间和数量保持不变

简而言之,运行自定义SQL查询只会降低性能,而不会提高性能。

您可能可以将代码缩减为以下内容:

foreach($this->adverisers as $adveriser) {     

    $meta = get_post_meta($adveriser->ID);

    $this->data[$adveriser->name][\'image\'] = bfi_thumb($meta[\'ss_advertisers_cats_image\'][0]), 
                                                         $this->imgDimensions  
                                                       );  

    $this->data[$adveriser->name][\'description\'] = $meta[\'ss_advertisers_cats_description\'][0];        

    $this->data[$adveriser->name][\'advertiser\'] = $wpdb->get_results( "SELECT DISTINCT * FROM {$wpdb->posts}
                                                          WHERE(post_type=\'brands\' OR post_type=\'boutiques\') 
                                                          AND post_author=\'{$adveriser->post_author}\' ", OBJECT 
                                                       ); 

    $this->data[$adveriser->name][\'advertiserRedirectionLink\'] = $meta[\'ss_advertisers_cats_link\'][0]; 
}
要了解我疯狂的全部描述和理由,请慢慢读this post 我最近对调用多个自定义字段的性能进行了研究

SO网友:Mark Kaplun

早期优化是99%不可读和不可维护代码的来源。(我刚才编的统计数字)

有两种优化

要使事情变得更快,要使事情变得合理快速,只有在代码准备就绪之后,您才能知道您需要的类型1优化是什么,并且您可以进行常规分析,并确定哪些是值得优化的。例如,如果该代码仅在管理员登录时执行,则优化该代码的优先级应为超低。如果您可以像W3TC那样使用页面缓存,那么可能根本不需要优化,因为代码很少执行。

处理类型1优化的最佳方法是缓存。如果无法缓存整页缓存,则需要进行部分缓存-例如,将整个计算的结果在瞬态中存储5分钟(或使用选项,但需要编写比瞬态提供的基于时间的失效更好的失效声明)

类型2优化实际上很重要,因为如果查询执行速度太慢,无法在30秒内执行,或者需要太多内存,那么它将无法完成,因此没有缓存方案可以帮助您。但是,与第一种类型的优化一样,只有当您有理由进行saw时,您才应该开始考虑它,因为测试服务器中的某些东西太慢了,并且没有随机尝试优化部分代码。

综上所述,在wordpress的上下文中需要记住的重要一点是,如果您愿意让核心通过使用API来优化DB查询,那么它在优化DB查询方面做了大量工作。例如,在实践中,几乎所有选项都会一次加载并存储在内存中get_option 信息技术does not 生成sql查询。同样的原则也适用于与帖子和查询相关的数据,因此代码中最大的问题是直接查询,它看起来可以写成wp\\u查询。除非您百分之百确定需要编写自己的SQL,否则请始终使用最高级的wordpress API。

结束

相关推荐

WPDB for post count on post

我知道了如何在author上显示自定义帖子类型的计数。php。我也试图在他们的自定义帖子上显示统计数据。同一查询不起作用。如何在自定义帖子上为用户显示自定义帖子的数量?我下面的查询适用于作者。php不是帖子类型本身,我不理解。 <?php global $wp_query; $curauth = $wp_query->get_queried_object(); $post_count = $wpdb->get_