我的代码库中有以下代码片段:
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
在一次/两次查询中获取所有必需的数据,或。。也许所呈现的代码并没有那么糟糕,也不会对性能造成太大的影响
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。