我一直在投入大量時間進行搜索并應用許多不同的測驗來嘗試查看是否可以優化此查詢,但到目前為止我還沒有成功。
所以這是基于一個超過 6M 條目的表,這個查詢需要超過 2 秒來執行:
SELECT DISTINCT b.meta_value as 'min'
FROM wp_postmeta as a
INNER JOIN wp_postmeta as b
ON a.post_id = b.post_id AND a.meta_key = 'Brand' AND b.meta_key = 'Yearofputtingintoproduction'
WHERE a.meta_value = 'BMW'
ORDER BY b.meta_value DESC
然后我有這個加載時間也超過 2 秒的:
SELECT DISTINCT b.meta_value
FROM wp_postmeta as a
INNER JOIN wp_postmeta as b
ON a.post_id = b.post_id AND b.meta_key = 'OnlineModel'
INNER JOIN wp_postmeta as c
ON a.post_id = c.post_id AND c.meta_key = 'Brand' AND a.meta_key = 'Yearofputtingintoproduction'
INNER JOIN wp_postmeta as d
ON a.post_id = d.post_id AND d.meta_key = 'Yearofstoppingproduction'
WHERE d.meta_key = 'Yearofstoppingproduction' AND d.meta_value >= '2020' AND a.meta_key = 'Yearofputtingintoproduction' AND a.meta_value <= '2021' AND c.meta_value = 'BMW'
ORDER BY b.meta_value ASC
我在這里做錯了什么,需要這么長時間?
任何幫助都感激不盡。
uj5u.com熱心網友回復:
您只需要一個表副本中的值,并且您需要使用 DISTINCT for 來洗掉重復項。這導致用 WHERE EXISTS 替換 JOIN。
SELECT [DISTINCT] b.meta_value as 'min'
FROM wp_postmeta as b
WHERE EXISTS ( SELECT NULL
FROM wp_postmeta as a
WHERE a.post_id = b.post_id
AND a.meta_key = 'Brand'
AND a.meta_value = 'BMW' )
AND b.meta_key = 'Yearofputtingintoproduction'
ORDER BY b.meta_value DESC
是否可以洗掉 DISTINCT 取決于資料。
uj5u.com熱心網友回復:
您是否安裝了https://wordpress.org/plugins/index-wp-mysql-for-speed/?這為 WP 中“元”表的性能問題提供了通用修復。
(這是在哪里WP的EAV模式尤其不適合用于查詢有問題的xample。一個簡單的表brand,model,start_year,并stop_year會導致一個更簡單和本質更快的查詢。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/375135.html
標籤:mysql WordPress的 表现
