我无法理解简单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)。
问题出在哪里?为什么整个查询运行速度如此之慢以及如何改进?感谢。
答案 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)
谢谢大家,我已经重建了一个查询并使用了"内部联接"办法。看起来没有好办法用我最初计划的想法来修复它。