【发布时间】:2026-01-19 08:05:01
【问题描述】:
我无法理解简单 MySQL 查询中的问题。请看这里
select SQL_NO_CACHE
ID,
post_title,
post_type
from wp_posts
where 1
and (wp_posts.ID in (select id from ...[complex subquery here]...))
这个查询运行时间很长(2.5 秒),但如果我单独运行子查询(从“in (..”) 开始的查询只需要 0.15 秒。子查询只返回 60 行,我认为整个查询已经在这种情况下跑得更快。
顺便说一句,我尝试使用固定 ID 列表而不是子查询来运行整个查询,例如
select SQL_NO_CACHE
ID,
post_title,
post_type
from wp_posts
where 1
and (wp_posts.ID in
(
48393,
52796, .... 58 more numbers))
而且它的工作速度非常快(约 1 毫秒)。
哪里出了问题?为什么整个查询运行如此缓慢,我该如何改进?谢谢。
【问题讨论】:
-
根据子查询,MySQL 可能认为它是一个“相关”子查询,并重复运行它,对 wp_posts 中的每一行运行一次。我有时会发现
INNER JOINing 这样的子查询更快;如果失败了,只需将子查询结果放入TEMPORARY表中,然后加入。
标签: mysql optimization query-optimization