TAX_QUERY真的在所有情况下都优于META_QUERY吗?

时间:2019-08-07 作者:Luis Rivera

Let me start saying that I know a \'tax_query\' is faster than \'meta_query\'.

It\'s always recommended to use taxonomies over custom meta when filtering by custom data is required, but here I found myself in this situation.

I\'m creating a Real Estate application where I have this obvious post type \'property\'. Each property is supposed to have X number of rooms and bathrooms.

Then in my app you can filter properties by range... for example: Show all properties that have from 3 to 18 rooms.

The custom field way would be to add a custom field, eg: \'rooms\' and then do my query like:

$args = array(
    \'post_type\'  => \'property\',
    \'meta_query\' => array(
        \'key\'     => \'rooms\',
        \'value\'   => array(3,18),
        \'type\'    => \'numeric\',
        \'compare\' => \'BETWEEN\',
    ),
);
$query = new WP_Query( $args );

The taxonomy way would be for example to create a custom taxonomy called \'property_rooms\', then create the terms like \'1\', \'2\', \'3\', etc.. and do my query by term ID\'s like:

$args = array(
    \'post_type\'  => \'property\',
    \'tax_query\' => array(
        \'taxonomy\' => \'property_rooms\',
        \'terms\'      => array(3,4,5,6,7,8,9,10,11,12,13,14,15...etc) // Just pretend these are the corresponding term id\'s
    )
);
$query = new WP_Query( $args );

And here\'s the question: Does tax_query beats meta_query even in situations like this?

It may be relevant to mention that we could be talking about thousands of properties.

Keep in mind sorting by these fields is neither a requirement nor a consideration to trade the speed of the query.

2 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

即使在这样的情况下,tax\\u query是否优于meta\\u query?

如果您有一组由许多帖子共享的公共值,并且您正在根据帖子是否具有特定值进行简单比较,那么分类法是合适的。如果您需要进行数字或范围比较(如您的示例),或者如果每个帖子的值都是唯一的,那么它们就不合适了。

以下是一些关于房地产网站分类法的示例:

物业类型(如房屋/公寓/联排别墅)应为分类法除了查询速度更快之外,拥有这些属性的分类法还可以让后端更轻松地管理它们,并让生成用于筛选的列表变得越来越容易。

但是,请记住,即使meta是筛选值的唯一可行选项,使用太多的meta查询也会严重影响查询的性能。这是因为您是基于元的值而不是ID进行查询的,并且值列没有索引。然而,仅仅因为它没有被索引,并不意味着它适合自己索引。这是因为wp\\u posteta的meta\\u value列为不同的事物保存了非常不同的类型和数量的数据。

如果需要使用大量的数字字段进行过滤,那么post meta和分类法都不合适。您最好使用自己的索引和更合适的列类型创建一个自定义表。然后可以将这些值存储在自定义表中,并使用posts_clauses, 或posts_join, 和posts_where 过滤器,将您自己的SQL添加到WP\\U查询中,以使用您的表进行更高效的过滤。

SO网友:Krzysiek Dróżdż

嗯,我不会说“tax\\u query胜过meta\\u query”。。。它们是有点不同的东西。

执行tax\\u查询时,SQL查询中需要两个联接。Meta\\u查询只会导致一个联接(如果只搜索一个Meta)。

那么什么时候tax\\u查询更好?例如,当您搜索分配给多个分类法的帖子时。

假设你想找到有2层、4间卧室、独立厨房和一个车库的房产。因此,您正在基于多个属性使用多个条件进行搜索。

在这种情况下:

tax\\u查询将生成一个SQL查询,其中只有2个连接和多个条件甚至更糟-tax\\u查询使用正确的ID和键,在meta\\u查询中,您必须使用字符串作为键。所以是的,在这种情况下,tax\\u查询必须更快。

但是如果出现以下情况,则Tax\\u查询是非常糟糕的选择:

您需要按价值排序(即按价格排序房地产),

  • 您搜索给定范围内的所有值(即搜索给定价格范围内的房地产),
  • 您对给定房地产有许多不同的值(即价格,因为房地产的不同价格几乎相同)
  • 因此,无税查询不会每次都超过meta\\u查询。它们是不同的东西,你应该根据需要使用它们。

    相关推荐

    使用新的WP-Query()从循环中过滤后期格式;

    嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post