WordPress核心-优化元查询生成的SQL?

时间:2013-11-27 作者:Vincent Mimoun-Prat

我有个问题plugin of mine 它使用post meta存储帖子的所有权。基本上,我的问题是WP_Meta_Query 类为每个meta\\u查询生成一个联接。我不明白为什么我们不能同样加入all 查询。

当然,当使用5到6个以上的查询时,查询需要花费太多的时间才能完成,插件无法获得帖子。

E、 g:这就是我要做的,以获得属于用户5、6、8和10的帖子(在真正的插件中,比较总是像,值看起来像“%| usr\\u 5 |%”,以解决一些高级所有权控制的情况):

\'meta_query\' => array( 
  \'relation\' => \'OR\',
  array(
    \'key\'      => \'owner\',
    \'value\'    => 5,
    \'compare\'  => \'=\'
  ),
  array(
    \'key\'      => \'owner\',
    \'value\'    => 6,
    \'compare\'  => \'=\'
  ),
  array(
    \'key\'      => \'owner\',
    \'value\'    => 8,
    \'compare\'  => \'=\'
  ),
  array(
    \'key\'      => \'owner\',
    \'value\'    => 10,
    \'compare\'  => \'=\'
  )
)
上面生成了一个SQL查询,该查询有4条JOIN语句(mt1到mt4),在WHERE子句中,使用每个JOIN进行比较。类似于:

mt1.meta_key = 5 OR mt2.meta_key = 6 OR mt3.meta_key = 8 OR mt4.meta_key = 10
这有什么意义??!所有这些都可以使用一个JOIN和WHERE子句来完成,如:

mt1.meta_key = 5 OR mt1.meta_key = 6 OR mt1.meta_key = 8 OR mt1.meta_key = 10
我有什么遗漏吗?多连接是为了处理一些比较类型吗?

2 个回复
最合适的回答,由SO网友:Vincent Mimoun-Prat 整理而成

如果我对可能的优化是正确的,我已经在Trac上打开了一个问题,并提交了一个补丁:http://core.trac.wordpress.org/ticket/26281

我的插件的页面查询时间从10多秒变为20毫秒。。。我希望没有边缘案例。

SO网友:KevinMiller

我们在开发Piklist时遇到了这个问题。也就是说,我们投入了大量的时间和测试来开发一个不会破坏您的站点或其他插件的解决方案。要解决您的问题,只需下载并安装Piklist,然后重试您的查询。现在Piklist确实提供了很多(它是一个框架),但它不会给系统增加太多开销。

注意:当前版本是beta版,但当前版本中没有影响WordPress的已知错误,只是在12月产品发布之前,我们正在解决核心中的一些错误。

http://downloads.wordpress.org/plugin/piklist.zip

如果你有任何问题,请告诉我。

结束

相关推荐