Mysql long子查询" in"问题

时间:2015-07-07 19:10:03

标签: mysql optimization query-optimization

我无法理解简单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秒),但是如果我单独运行子查询(那个来自"在(...")中的那个只需要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 ms)。

问题出在哪里?为什么整个查询运行速度如此之慢以及如何改进?感谢。

3 个答案:

答案 0 :(得分:1)

您的号码实际上是一张未编入索引的表格。 通过x = c(8,16,64,128,256) y = c(7030.8, 3624.0, 1045.8, 646.2, 369.0) 运行您的查询,并见证表可能会感到悲伤。

以下内容可以解释执行计划:

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

答案 1 :(得分:1)

如上所述,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}

希望这是有帮助的

答案 2 :(得分:0)

谢谢大家,我已经重建了一个查询并使用了"内部联接"办法。看起来没有好办法用我最初计划的想法来修复它。