具有多个元键的慢元查询

时间:2017-08-09 作者:user3689240

我对按自定义字段筛选帖子有问题。在我的页面上,我有一个包含15个条件(放射性核素和输入)的表单,我想用它们过滤我的自定义post-type项目。我的问题是,当我使用这么多元键时,查询速度非常慢。这是我的代码:

$posts = get_posts(array(
    \'numberposts\'   => -1,
    \'post_type\'     => \'projekt\',
    \'post_status\' => \'publish\',
    \'s\' => $s,
    \'meta_query\'    => 
         array(
        \'relation\'  => \'AND\',
         array(
        \'key\'       => \'technologia_wyszukiwarka\',
        \'value\'     => $techs,
        \'compare\'   => \'LIKE\'       
        ),
        array(
        \'key\'       => \'zabudowa_wyszukiwarka\',
        \'value\'     => $styls,
        \'compare\'   => \'LIKE\'
        ),
        array(
            \'key\'       => \'garaz_wyszukiwarka\',
            \'value\'     => $garazs,
            \'compare\'   => \'LIKE\'
        ),
        array(
            \'key\'       => \'mdm_wyszukiwarka\',
            \'value\'     => $mdms,
            \'compare\'   => \'LIKE\'
        ),
        array(
            \'key\'       => \'powierzchnia_wyszukiwarka\',
            \'value\'     => $pows,
            \'compare\'   => \'LIKE\'
        ),
        array(
            \'key\'       => \'kondygnacja_wyszukiwarka\',
            \'value\'     => $konds,
            \'compare\'   => \'LIKE\'
        ),
        array(
            \'key\'       => \'ogrzewanie_wyszukiwarka\',
            \'value\'     => $ogrzewanies,
            \'compare\'   => \'LIKE\'
        ),  
        array(
            \'key\'       => \'liczba_pokoi_wyszukiwarka\',
            \'value\'     => $pokojes,
            \'compare\'   => \'LIKE\'
        ),      
        array(
            \'key\'       => \'inne_wyszukiwarka\',
            \'value\'     => $innes,
            \'compare\'   => \'LIKE\'
        ),  
        array(
            \'key\'       => \'kat_dachu_wyszukiwarka\',
            \'value\'     => array($katods,$katdos),
            \'compare\'   => \'BETWEEN\',
            \'type\' => \'NUMERIC\'
        ),  

    ),
));
我的查询时间WP_Query->get_posts 大约是10秒。但当我删除最后的条件时kat_dachu_wyszukiwarka 时间更短,可以接受0.5秒,我用查询监视器进行了检查。不幸的是,我需要这个字段和几个字段。因此,我的问题是如何更快地执行查询?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

这里的问题是post meta不是为这些类型的搜索而设计的,这就是为什么存在分类表,否则类别和标记将存储为post meta

当您已经知道帖子ID时,Post meta可用于获取数据。当您已经知道数据时,分类法可用于查找帖子。许多自定义字段更适合作为同名的非层次分类法。

至于加快元查询的速度,我很抱歉,但您所做的基本上是昂贵的,而且无法避免。您可以尝试缓存结果,但这是次优的。

您需要更改查询以使用分类法,这意味着要修改数据。要么将一些post元数据移动到分类法中,要么将数据同时存储在post元数据和分类法中。

缓解这一问题的潜在方法包括弹性搜索集群

您还指定了-1 对于最大数量的职位,这可能是危险的。如果返回10000篇帖子,服务器可能会超时,数据库可能会过载。总是设定一个上限,即使这是一个你永远无法达到的上限

摘要:使用元查询查找帖子的成本非常高,Post meta不是为过滤而构建的,分类法是为过滤而构建的,而且它的设计速度要快得多,因为您已经知道了哪些帖子,所以get_post_meta 是一个快速函数,总是对获取的帖子数量设置上限

结束

相关推荐