web-dev-qa-db-ja.com

すべての状況で、tax_queryは実際にmeta_queryに勝っていますか?

「tax_query」の方が「meta_query」よりも高速であることを知っています。

カスタムデータによるフィルタリングが必要な場合は、常にカスタムメタよりも分類法を使用することをお勧めしますが、ここではこの状況に陥っていました。

私はこの明らかな投稿タイプ「プロパティ」がある不動産アプリケーションを作成しています。各施設には、X個の部屋とバスルームがあると想定されています。

次に、私のアプリでは、範囲でプロパティをフィルタリングできます...例:3〜18室のすべてのプロパティを表示します。

カスタムフィールドの方法は、カスタムフィールドを追加することです。例: 'rooms'そして、次のようなクエリを実行します。

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

分類方法は、たとえば、「property_rooms」というカスタム分類を作成してから、「1」、「2」、「3」などの用語を作成し、用語IDで次のようにクエリを実行します。

$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 );

そして、これが質問です:このような状況でも、tax_queryはmeta_queryに勝りますか?

何千もの物件について話している可能性があることを言及することは適切かもしれません。

これらのフィールドによる並べ替えは、クエリの速度をトレードオフするための要件でも考慮事項でもありません。

3
Luis Rivera

このような状況でも、tax_queryはmeta_queryに勝りますか?

番号。

分類は、多くの投稿で共有される共通の値のセットがあり、投稿に特定の値があるかどうかに基づいて単純な比較を行う場合に適しています。これらはnotは、例のように数値または範囲の比較を実行する必要がある場合、または値がすべての投稿で一意になる場合に適しています。

不動産サイトで分類すべきものとすべきでないものの例をいくつか示します。

  • プロパティタイプ。 House/Apartment/Townhouseは分類法である必要があります。
  • 購入/レンタルは分類法である必要があります。
  • 機能など。ペット可/エアコン/食器洗い機、分類にしてください。
  • 寝室の数はメタである必要があります。
  • 駐車スペースの数。メタである必要があります。
  • アドレス、メタである必要があります。

クエリの高速化に加えて、これらのプロパティの分類法を使用すると、バックエンドでのプロパティの管理が容易になり、フィルタリング用のリストの生成がかなり簡単かつ高速になります。

ただし、値をフィルタリングするための唯一の実行可能なオプションがメタである場合でも、メタクエリを使用しすぎると、クエリのパフォーマンスが実際に低下することに注意してください。これは、IDではなくメタのvalueに基づいてクエリを実行しており、値の列にインデックスが付けられていないためです。ただし、インデックス付けされていないからといって、自分でインデックス付けするのが適切であるとは限りません。これは、wp_postmetaのmeta_value列に、さまざまなデータと非常に異なる種類のデータが保持されているためです。

フィルタリングに使用する必要がある数値フィールドが多数ある場合は、ポストメタも分類法も適切ではない可能性があります。独自のインデックスとより適切な列タイプを使用してカスタムテーブルを作成した方がよい場合があります。次に、それらの値をカスタムテーブルに格納し、posts_clauses、またはposts_joinposts_whereフィルターを使用して独自のSQLをWP_Queryに追加し、テーブルを使用してより効率的なフィルタリングを行います。

3
Jacob Peattie

"tax_query beats meta_query" ...とは言えませんが、それらは少し異なります。

Tax_queryを実行する場合、SQLクエリには2つのJOINSが必要です。 Meta_queryの結果、結合は1つだけになります(メタを1つだけ検索する場合)。

では、tax_queryの方が良いのはいつですか。たとえば、複数の分類法に割り当てられた投稿を検索するとします。

2フロア、4ベッドルーム、独立したキッチン、ガレージがある物件を検索するとします。つまり、複数のプロパティに基づいて複数の条件で検索を行っています。

このような場合には:

  • tax_queryは、2つのJOINSとWHERE部分に複数の条件を持つSQLクエリになります。
  • meta_queryは、検索のすべてのプロパティに対して1つのJOINを持つSQLクエリになります。

さらに悪いことに、tax_queryは適切なIDとキーを使用し、meta_queryでは文字列をキーとして使用する必要があります。そうそう-そのような場合、tax_queryはより高速でなければなりません。

しかし...次の場合、Tax_queriesは本当に悪い選択です。

  • その値で注文する必要があります(つまり、価格でプロパティを注文します)。
  • 特定の範囲内のすべての値を検索します(つまり、特定の価格範囲内のプロパティを検索します)。
  • 特定のプロパティにはさまざまな値がたくさんあります(つまり、プロパティと同じ数の異なる価格があるため、価格)。

したがって、no-tax_queryがmeta_queryを毎回上回るわけではありません。それらは異なるものであり、必要に応じて使用する必要があります。

0