我有一个具有多个自定义分类法的站点,并且发现该站点中最慢的部分之一正试图同时使用OR查询其中的多个分类法。我用的是WP_Query
像这样:
array(
\'tax_query\' => array(
\'relation\' => \'OR\',
array(\'taxonomy\' => \'tax1\', \'field\' => \'slug\', \'terms\' => \'term1\'),
array(\'taxonomy\' => \'tax2\', \'field\' => \'slug\', \'terms\' => \'term2\'),
array(\'taxonomy\' => \'tax3\', \'field\' => \'slug\', \'terms\' => \'term3\'),
array(\'taxonomy\' => \'tax4\', \'field\' => \'slug\', \'terms\' => \'term4\'),
)
)
它生成的SQL需要不可接受的6秒钟才能运行:SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_relationships AS tt1 ON (wp_posts.ID = tt1.object_id)
INNER JOIN wp_term_relationships AS tt2 ON (wp_posts.ID = tt2.object_id)
INNER JOIN wp_term_relationships AS tt3 ON (wp_posts.ID = tt3.object_id)
WHERE 1=1 AND wp_posts.ID NOT IN (70)
AND (wp_term_relationships.term_taxonomy_id IN (23)
OR tt1.term_taxonomy_id IN (5)
OR tt2.term_taxonomy_id IN (11)
OR tt3.term_taxonomy_id IN (10) )
AND (wp_posts.post_status = \'publish\')
GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 500
但这个等效查询需要更好的0.29秒:SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1 AND wp_posts.ID NOT IN (70)
AND (wp_term_relationships.term_taxonomy_id IN (23, 5, 11, 10))
AND (wp_posts.post_status = \'publish\')
GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 500
显然,多重连接使其速度比需要的慢。SQL不关心术语是否来自不同的分类法,但是WP_Query
是因为他们被slug查到了。有没有办法说服WP_Query
生成更接近第二个的东西?(注意,为了保护我的客户,上述内容已匿名)