0

したがって、2 つのクエリがあります。first が second よりもはるかに高速に実行されるのはなぜですか? 内部結合を最初のものと同じくらい高速に最適化するにはどうすればよいですか?

合計レコード数 4 000 000 以上

idTerminals はインデックス化されています


select (select name 
          from terminals 
          where terminals.idTerminals = AnalyzeProfitResults.idTerminals),
        currency, 
        count(*) 
from AnalyzeProfitResults
group by AnalyzeProfitResults.idTerminals,currency;


select name,
        currency, 
        count(*) 
from AnalyzeProfitResults
inner join terminals on terminals.idTerminals = AnalyzeProfitResults.idTerminals
group by AnalyzeProfitResults.idTerminals,currency;

    

結果は同じです:


name,currency,count(*)
"Buy or sell",EURUSD,235105
"Buy or sell",GBPUSD,14515
"Buy or sell",USDJPY,235298
"very strict",AUDJPY,234787
"very strict",AUDUSD,235298
"very strict",CHFJPY,235298
"very strict",EURJPY,235298
"very strict",EURUSD,235298
"very strict",GBPJPY,235298
"very strict",GBPUSD,235298
"very strict",NZDUSD,235298
"very strict",USDCHF,235298
"very strict",USDJPY,235298
",normal",AUDJPY,235298
",normal",AUDUSD,36391
",normal",EURUSD,234985
",normal",GBPJPY,117649
",normal",NZDUSD,198552
",normal",USDCHF,235298
",normal",USDJPY,235298
 
4

1 に答える 1

1

後者のクエリでは、MySQL が結合AnalyzeProfitResultsし、操作の行terminalsが生成されると思います。に 400 万行ありますが、ほんの一握りのレコードしか含まれていなくても、これは大量の行です。前者の場合、MySQL は 400 万行でグループ化を実行し、結果として与えられた 20 行を生成し、20 行のそれぞれに対してサブクエリを実行します (内部的に結合に書き換えられることさえあります。もっと早く)。size(AnalyzeProfitResults) * size(terminals)group byAnalyzeProfitResultsterminals

編集: 明示的な結合を使用した最初のクエリは次のとおりです。

select terminals.name, APR_aggregated.*
from terminals join (
    select APR.currency, count(*)
    from AnalyzeProfitResults as APR
    group by APR.idTerminals, APR.currency
) as APR_aggregated on terminals.idTerminals = APR_aggregated.idTerminals
于 2012-07-21T17:50:09.133 に答える