9

私はこのクエリを持っています:

select *
from transaction_batch
where id IN
(
    select MAX(id) as id
    from transaction_batch
    where status_id IN (1,2)
    group by status_id
);

内部クエリは非常に高速(0.1秒未満)で実行され、ステータス1用とステータス2用の2つのIDを取得します。次に、主キーに基づいて選択するため、インデックスが作成されます。Explainクエリは、whereのみを使用して135k行を検索していると言っていますが、これがなぜそれほど遅いのか、私は一生理解できません。

4

3 に答える 3

13

内部クエリは、テーブルのすべての行に対して個別に何度も実行されます。

内側のクエリには外側のクエリへの参照がないため、これら 2 つのクエリを分割し、内側のクエリの結果をWHERE句に挿入することをお勧めします。

于 2012-06-04T15:34:02.113 に答える
8
select b.*
from transaction_batch b
inner join (
    select max(id) as id
    from transaction_batch
    where status_id in (1, 2)
    group by status_id
) bm on b.id = bm.id
于 2012-06-04T15:34:36.950 に答える