按META_VALUE对帖子列表进行排序会导致性能问题吗?

时间:2012-03-16 作者:Amit Kumar Gupta

为了对代码进行一些优化,并为插件添加新功能,我想显示按特定元列值排序的帖子,如下所示;

query_posts($query_string . \'&meta_key=views&orderby=meta_value&order=DESC\');
这会不会导致总帖子数超过10000多篇的大型博客出现性能问题?

我可以使用WP\\u Query()或get\\u posts()来代替Query\\u post()

1 个回复
SO网友:kaiser

meta\\u查询(&U);定义meta/tax_query 并将新的数组样式参数列表用于多组术语或自定义字段键,那么您的查询可能类似于以下内容

array(
  \'tax_query\' => array(
    \'relation\' => \'OR\',
    array(\'taxonomy\' => \'tax1\', \'field\' => \'slug\', \'terms\' => \'term1\'),
    array(\'taxonomy\' => \'tax2\', \'field\' => \'slug\', \'terms\' => \'term2\'),
  )
)
结果是:

SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts  
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
INNER JOIN wp_term_relationships AS tt1 ON (wp_posts.ID = tt1.object_id) 
WHERE 1=1 AND
...
AND (wp_term_relationships.term_taxonomy_id IN (XXX) 
  OR tt1.term_taxonomy_id IN (YYY) ) 
...
示例代码取自this trac ticket by @Otto. 请在那里订阅以跟踪其进度,并投票支持对core进行更改

查询问题&hellip

你好;基本上你会得到JOIN 对于每列。没有必要,因为桌子已经与1号不锈钢熔化在一起了JOIN. 可悲的是,core在当前状态3.3下的行为就是这样。并将在3.4中保持这样。

也许是一个解决方案

您最好的机会是拦截posts_clauses 过滤插件并手动更改查询。这个解决方案的真正问题是你必须str_replace( $search, $replace, $query ); 在插件中。一方面,这可能会减慢速度,另一方面,你必须遵循这张罚单,因为当这张罚单进入时,你的插件就会崩溃(最好在你的插件代码中留下一个指向罚单的链接)。

我能做什么

跳转到trac并add your thoughts & patches to the ticket. 如果你是一个真正的英雄,那么你可以尝试meta_query 问题也来了。

社区会感谢您:)

如果您认为此img不合适,请将其删除

结束

相关推荐