将子查询拆分为单独查询更有效吗?

时间:2015-04-25 08:39:24

标签: java mysql performance correlated-subquery detachedcriteria

我有一个像这样的子查询。基本上我使用多个分离标准来形成多个子查询。

SELECT
        this_.id AS y0_,
        this_.a AS y1_,
        this_.b AS y2_,
        this_.c AS y3_,
        this_.d AS y4_,
        this_.e AS y5_ 
    FROM
        table_a this_ 
    WHERE
        this_.id IN (
            SELECT
                this_.a AS y0_ 
            FROM
                table_b this_ 
            WHERE
                this_.b=?
                )

目前我的数据库表中没有大量数据。执行查询所需的时间不到0.01秒。但是现在我被告知要将每个子查询作为单独的查询来为每个IN语句提供值列表。我不知道知情策略与当前子查询(上面发布的)之间有什么区别。子查询还返回其IN语句的id列表,如果使用sepearate查询,id列表也将被提供给IN语句?为什么这两种策略在性能上有所不同。

我被告知如果表中有大量数据,我当前的子查询会变慢。这两种策略都在做同样的功能。那么为什么它会导致子查询性能下降呢?

只需考虑一个示例Java方法调用

public static void main(String[] args){
    System.out.print( c( b( a() ) ) );
}

public String a(){
    return "success";
}
public String b(String string){
    return string;
}
public String c(String string){
    return string;
}

首先调用a,然后调用b将返回a,最后调用c将调用b返回c。然后将显示k_mean的返回值。

我假设MySQL子查询中也遵循相同的功能。我对吗?那么为什么在与所有单独查询的总时间进行比较时,子查询会导致性能下降?

1 个答案:

答案 0 :(得分:1)

我相信你问的是b / w相关子查询和子查询及其性能方面的差异

子查询: - 内部查询仅执行一次内部查询将首先执行,外部查询使用内部查询的输出

相关子查询: - 外部查询将首先执行,对于外部查询的每一行,内部查询将被执行。因此,内部查询将在外部查询的结果中执行与行数相同的次数。

使用Co相关的子查询性能降低,因为它执行NXM迭代