簡體   English   中英

WordPress:通過添加稅收查詢來提高元查詢性能是個好主意嗎?

[英]WordPress: is it a good idea to improve meta query performance by adding tax query?

我知道在帖子分組方面,首選使用分類法而不是元數據。 簡而言之, thisthis是說“將元用於唯一數據和分類法用於重復數據(對帖子進行分組的數據)”。

但我想知道是否有可能通過引入代表該元不同范圍的分類法來提高元查詢性能?

假設我有一家商店,有帖子類型的產品。 每個產品都有價格元。 我在數據庫元表中有數百萬行。 如果我添加一個將用於前端過濾器的價格范圍分類法會怎樣? 價格范圍將像“1-100$”、“100-1000$”等。用戶點擊“100-1000$”+按價格排序。 通過這種方式,我將查詢標記為“100-1000$”的帖子,然后僅按價格元對它們進行排序。 它會提高查詢性能嗎?

如果允許用戶輸入“from”和“to”價格,如何實現? 使用上述方法並僅為價格范圍添加分類元可能是個好主意? 這將如下所示: - 用戶選擇“90-900$” - 獲取與該范圍匹配的所有價格范圍條款。 IE。 “1-100”和“100-1000” - 查詢“1-100”和“100-1000”價格范圍(條款)中的帖子並將元值價格設置為 >90 和 <900 這也會提高性能嗎? 這種方法需要 2 個查詢:獲取術語(按術語元過濾),獲取帖子。

我沒有機會用一個非常龐大的數據庫來檢查它,因為我所有的項目都不是那么大。 但是我仍然對我的任何方法是否適用於大型網站感興趣?

編輯(1):我正在附加 PHP 和 SQL

僅按元查詢:

new WP_Query([
    'post_type' => 'my_product',
    'meta_query' => [
        [
            'key'     => 'price',
            'value'   => 90,
            'compare' => '>=',
            'type'    => 'NUMERIC'
        ],
        [
            'key'     => 'price',
            'value'   => 900,
            'compare' => '<=',
            'type'    => 'NUMERIC'
        ]
    ]
]);
EXPLAIN SELECT  SQL_CALC_FOUND_ROWS wp_posts.ID
    FROM  wp_posts
    INNER JOIN  wp_postmeta  ON ( wp_posts.ID = wp_postmeta.post_id )
    INNER JOIN  wp_postmeta AS mt1  ON ( wp_posts.ID = mt1.post_id )
    WHERE  1=1
      AND  ( ( wp_postmeta.meta_key = 'price'
                      AND  CAST(wp_postmeta.meta_value AS SIGNED) >= '90' )
              AND  ( mt1.meta_key = 'price'
                      AND  CAST(mt1.meta_value AS SIGNED) <= '900' ) 
           )
      AND  wp_posts.post_type = 'my_product'
      AND  (   wp_posts.post_status = 'publish'
           OR  wp_posts.post_status = 'acf-disabled'
           OR  wp_posts.post_author = 1 AND  wp_posts.post_status = 'private'
           )
    GROUP BY  wp_posts.ID
    ORDER BY  wp_posts.post_date DESC
    LIMIT  0, 10



1   SIMPLE  wp_postmeta ref     post_id,meta_key    meta_key    767 const   1   Using where; Using temporary; Using filesort    
1   SIMPLE  mt1         ref     post_id,meta_key    meta_key    767 const   1   Using where 
1   SIMPLE  wp_posts    eq_ref  PRIMARY,...         PRIMARY       8 loc.own-acf-plugin.wp_postmeta.post_id  1   Using where 

按稅和元查詢:

new WP_Query([
    'post_type' => 'my_product',
    'meta_query' => [
        [
            'key'     => 'price',
            'value'   => 90,
            'compare' => '>=',
            'type'    => 'NUMERIC'
        ],
        [
            'key'     => 'price',
            'value'   => 900,
            'compare' => '<=',
            'type'    => 'NUMERIC'
        ]
    ],
    'tax_query' => [
        [
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => [ '0-100', '100-1000' ]
        ]
    ]
])
EXPLAIN SELECT  SQL_CALC_FOUND_ROWS wp_posts.ID
    FROM  wp_posts
    LEFT JOIN  wp_term_relationships  ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN  wp_postmeta  ON ( wp_posts.ID = wp_postmeta.post_id )
    INNER JOIN  wp_postmeta AS mt1  ON ( wp_posts.ID = mt1.post_id )
    WHERE  1=1
      AND  ( wp_term_relationships.term_taxonomy_id IN (1,2) )
      AND  ( ( wp_postmeta.meta_key = 'price'
                      AND  CAST(wp_postmeta.meta_value AS SIGNED) >= '90' )
              AND  ( mt1.meta_key = 'price'
                      AND  CAST(mt1.meta_value AS SIGNED) <= '900' ) 
           )
      AND  wp_posts.post_type = 'my_product'
      AND  (   wp_posts.post_status = 'publish'
           OR  wp_posts.post_status = 'acf-disabled'
           OR  wp_posts.post_author = 1 AND  wp_posts.post_status = 'private'
           )
    GROUP BY  wp_posts.ID
    ORDER BY  wp_posts.post_date DESC
    LIMIT  0, 10



1   SIMPLE  wp_term_relationships   index   PRIMARY,term_taxonomy_id    PRIMARY 16  
    NULL
    1   Using where; Using index; Using temporary; Using f...   
1   SIMPLE  wp_postmeta             ref     post_id,meta_key       
   meta_key 767 const   1   Using where 
1   SIMPLE  mt1                     ref     post_id,meta_key    meta_key    767 const   1   Using where 
1   SIMPLE  wp_posts                eq_ref  PRIMARY,type_status_date,post_author    PRIMARY 8   loc.own-acf-plugin.wp_term_relationships.object_id  1   Using where 

以下問題導致性能不佳。 (不知道WP中哪些可以改進。)

  • OR很難優化
  • wp_postmeta兩個JOINs 可以通過僅將其JOIN一次並執行BETWEEN..AND..嗎?
  • 添加額外的JOIN (到分類法)可能會減慢它的速度。
  • 無論如何,EAV 模式模式都很糟糕。
  • WP 的 EAV 架構的索引效率低下。 http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta
  • SQL_CALC_FOUND_ROWS需要付出一些代價。 特別是,它在找到所需的 10( LIMIT )后無法退出。
  • GROUP BYORDER BY是不同的,因此需要額外的排序。 將兩者都更改為ID可以解決此問題。

即使您添加的一項有所幫助,也不足以抵消其他 6 個問題。

也許最大的解決方法是在wp_posts有一個名為price (並適當索引)的數字列。 但這與 WP 模式哲學完全不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM