子查询与联接

Subqueries vs joins

我重构应用程序继承另一家公司,而不是像一个子查询中使用内部联接的慢节

where id in (select id from ... )

重构的查询运行大约 100 倍的速度更快。(为 ~ 0.3 ~ 50 秒)预期的改进,但任何人都可以解释为什么它是如此强硬?这些列用在 where 子句的所有索引。不会 SQL where 中执行的查询子句行或其他每一次?

更新-解释的结果︰

区别在于第二部分"其中 id () 中的"查询-

2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id   4   const   2966    Using where

与 1 的索引的行与联接︰

    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index
2008-09-26 18:58:53
问题评论:

可能的重复项的加入与子查询

不是重复。这个问题是特别关于达成的性能差异。其他问题是更一般的自由有关的优点和缺点的各种方法和原因的一种方法看起来更受欢迎。

回答:

"相关子查询"(亦即,在其中一个 where 条件取决于获取包含查询的行中的值) 将为每一行执行一次。非相关子查询 (在其中一个 where 条件包含查询无关) 将在开始时执行一次。SQL 引擎会自动将这种区别。

但是,是的说明计划将为您提供更新的详细信息。

解释用于 + 1

而在索引上发生连接,正在运行子查询的每一行的一次

我认为不是如此。SQL 引擎应子查询只运行一次,并将结果用作列表。

这取决于-如果子查询以某种方式与外部查询相关联 (使用其数据),它与每个行执行。

却是在这种情况,但它并不是一般情况。

下面是一个示例,介绍如何在 MySQL 6.0 中计算子查询.

新的优化器会将这种类型的子查询转换为连接。

这就是对 MySQL 6.0 改进的优化程序,谢谢好文章

在每个版本上运行解释计划,它将告诉您原因。

对它们都经过查询优化程序的数据集运行查询之前,优化器将尝试组织中这种方式,它可以从结果集,因为它可以快速删除任意多个元组 (行) 的查询。使用子查询 (尤其是坏的) 时,通常无法从外部查询开始运行之前结果集修剪过元。

与出查看查询硬要说什么有关原始的不错但我猜测会只是优化器不能制作好得多的问题。运行解释将显示用于检索数据的优化程序方法。

内容来源于Stack Overflow Subqueries vs joins
请输入您的翻译

Subqueries vs joins

确认取消