Mysql 长子查询 "in" 问题

Mysql long subquery "in" issue

我无法理解简单 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]...))

这个查询 运行ning 相当长(2.5 秒),但是如果我单独 运行ning 子查询(来自 "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 毫秒)。

哪里有问题?为什么整个查询 运行ning 这么慢,我该如何改进它?谢谢

您的号码实际上是未编入索引的 table。 运行 您通过 explain 查询并见证了 table 扫描问题。

下面可以解释一个执行计划:

http://www.sitepoint.com/using-explain-to-write-better-mysql-queries/

如上所述,mysql 在这种情况下不擅长优化查询。可能发生的情况是它对 wp_posts 中的每条记录执行一次子查询。通过将它们组合成一个带有连接

的查询来避免这种行为
select SQL_NO_CACHE
    ID,
    post_title,
    post_type
from wp_posts
left join another_table on wp_posts.id = another_table.post_id
where {complex conditions from your other query}

希望这对您有所帮助

谢谢大家,我重建了一个查询并使用了 "inner join" 方式。看来没有什么好方法可以用我最初计划的想法来解决它。