![](/img/trans.png)
[英]Is there a way to improve the performance of this simple WordPress database query?
[英]WordPress: is it a good idea to improve meta query performance by adding tax query?
我知道在帖子分組方面,首選使用分類法而不是元數據。 簡而言之, this和this是說“將元用於唯一數據和分類法用於重復數據(對帖子進行分組的數據)”。
但我想知道是否有可能通過引入代表該元不同范圍的分類法來提高元查詢性能?
假設我有一家商店,有帖子類型的產品。 每個產品都有價格元。 我在數據庫元表中有數百萬行。 如果我添加一個將用於前端過濾器的價格范圍分類法會怎樣? 價格范圍將像“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
(到分類法)可能會減慢它的速度。SQL_CALC_FOUND_ROWS
需要付出一些代價。 特別是,它在找到所需的 10( LIMIT
)后無法退出。GROUP BY
和ORDER BY
是不同的,因此需要額外的排序。 將兩者都更改為ID
可以解決此問題。即使您添加的一項有所幫助,也不足以抵消其他 6 個問題。
也許最大的解決方法是在wp_posts
有一個名為price
(並適當索引)的數字列。 但這與 WP 模式哲學完全不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.