WordPress使用NOT EXISTS的meta_query引发慢查询问题求助
WordPress WP_Query 慢查询优化问题
我的数据库规模不大:wp_posts表有10000行,wp_postmeta表有100000行,但某条WP_Query查询执行耗时约5-7秒。
传入的WP_Query参数
Array( [post_type] => post [post_status] => publish [ignore_sticky_posts] => 0 [posts_per_page] => 1 [orderby] => rand [meta_key] => [meta_value] => [order] => DESC [offset] => 0 [post__not_in] => Array ( ) [author__in] => Array ( ) [tax_query] => Array ( [relation] => AND [0] => Array ( [taxonomy] => category [field] => slug [terms] => Array ( [0] => beauty ) [operator] => IN [include_children] => 0 ) ) [meta_query] => Array ( [relation] => OR [0] => Array ( [key] => sponsored [value] => 1 [compare] => != [type] => CHAR ) [1] => Array ( [key] => sponsored [value] => [compare] => NOT EXISTS [type] => CHAR ) ) )
生成的SQL查询语句
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 ) LEFT JOIN wp_postmeta ON ( wp_posts.id = wp_postmeta.post_id ) LEFT JOIN wp_postmeta AS mt1 ON ( wp_posts.id = mt1.post_id AND mt1.meta_key = 'sponsored' ) WHERE 1 = 1 AND ( wp_term_relationships.term_taxonomy_id IN ( 3 ) ) AND ( ( wp_postmeta.meta_key = 'sponsored' AND wp_postmeta.meta_value != '1' ) OR mt1.post_id IS NULL ) AND wp_posts.post_type = 'post' AND (( wp_posts.post_status = 'publish' )) GROUP BY wp_posts.id ORDER BY Rand() LIMIT 0, 1
问题定位
我发现移除以下meta_query条件后,慢查询问题消失:
Array( [key] => sponsored [value] => [compare] => NOT EXISTS [type] => CHAR )
对应的SQL语句部分为:
OR mt1.post_id IS NULL
需求
我需要筛选出标记为sponsored == 0或未设置sponsored元键的文章,恳请帮忙提供更高效的WP_Query/SQL查询方案,或者解释该条件导致查询耗时激增的原因。
内容的提问来源于stack exchange,提问作者PavKR
相关产品推荐
相关产品推荐

