【发布时间】:2014-07-04 04:29:06
【问题描述】:
我有一个基于 WordPress 的网站,它为区域科学期刊编目学术文章。
简单地说,系统有几千个“帖子”,每个都有一个“pub_type”分类法,其中只选择了一个术语:“手稿”,或其他。
每个帖子还有与其相关的各种其他分类法/术语。
目标:获取特定分类法的术语列表。对于每个术语,计算与其相关的帖子数,并确定其中有多少帖子在“pub_type”分类中设置了“手稿”。
当前查询:
SELECT term_id, term_id as term_id_b, name, slug,
( SELECT COUNT(id) FROM wp_posts WHERE id IN
( SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN
( SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id = term_id_b )
) AND post_status = "publish" ) as count,
( SELECT COUNT(id) FROM wp_posts WHERE id IN
( SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN
( SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id IN
( SELECT term_id FROM wp_terms WHERE term_id = term_id_b )
)
)
AND id IN
( SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN
( SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id =
( SELECT term_id FROM wp_terms WHERE name = "Manuscript" )
AND taxonomy = "pub_type" )
)
AND post_status = "publish"
) as manuscript_count
FROM wp_terms
WHERE term_id IN
( SELECT term_id FROM wp_term_taxonomy WHERE taxonomy = "'.$taxonomy.'" )
ORDER BY name ASC
虽然此查询确实有效,但它的运行速度非常慢...根据服务器负载在 3-5 分钟之间。太糟糕了,为了保持网站性能,我不得不将查询结果缓存到 JSON 文本文件中,并且只让查询每 2 小时运行一次。
我知道这里的主要问题是我对所有内容都使用了子查询。虽然我正在尝试了解有关使用联接的更多信息,但我还不够了解以任何其他方式编写此查询。
谁能就我如何驯服这只野兽提供一些见解或建议?
编辑:这是查询的 EXPLAIN 输出的屏幕截图:
【问题讨论】:
-
很多时候子查询,
WHERE EXISTS比WHERE IN快。但是,为了给您一个更好的答案,我需要查看查询计划。您能否将EXPLAIN PLAN输出添加到您的问题中? -
如果我想去那里,我不会从这里开始。 :-( 考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集。
-
你是说你想这样做:计算每个词条为 pub_type 分类法的帖子数?
标签: mysql wordpress performance subquery taxonomy