2012-06-04 2 views
4

내가이 쿼리가 :하위 쿼리가있는이 SQL 쿼리의 속도가 느린 이유는 무엇입니까?

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 초)을 실행하는 두 개의 ID 년대, 상태 1 일, 상태 2를 얻을 수를, 다음은 기본 키에 따라 선택됩니다 그것 때문에 색인이 생성됩니다. Explain 질의는 135K 행을 어디에서 사용하고 있는지를 찾고 있으며, 내 인생에서 왜 그렇게 느린 지 알 수 없다고합니다.

+0

MySQL은 하위 쿼리를 최적화하는 것에 대해 꽤 바보입니다. 그래서 느립니다. 그것을 향상시키는 유일한 방법은 JOIN (RedFilter에 표시된 것처럼)으로 다시 쓰는 것입니다. –

답변

6
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 
+2

나는 op가이 쿼리를 시도해야한다고 동의하지만 op의 질문에 전혀 대답하지 않는다. – Lamak

+0

고마워, 실제로는 많은 의미가있다. (질문에 직접 대답하지는 않지만 왜 더 효과가 있는지). –

+0

@Lamak 이유에 대한 설명이 없기 때문에 사과드립니다. MySQL 내부를 이해하지 못합니다. 내가 할 수있는 것은 내가 발견 한 방법이 경험적으로 더 빠르다는 것을 보여주는 것이다. 언제나 그렇듯이 EXPLAIN은 당신의 친구입니다. – RedFilter

7

내부 쿼리는 테이블의 모든 행에 대해 계속 seperatly 실행됩니다.

내부 쿼리에 외부 쿼리에 대한 참조가 없으므로이 두 쿼리를 분할하고 WHERE 절에 내부 쿼리의 결과를 삽입하는 것이 좋습니다.

+0

이것은 실제로 질문에 답합니다. OP가 가리키는대로 .1s가 걸리더라도 반환 된 모든 행에 의해 곱해집니다. 100,000 개의 행을 반환하면 10,000,000 (167m)의 쿼리 만 수행 할 수 있습니다. –

+0

하위 쿼리를 사용하는 '이유'에 대한 대답이 훨씬 느립니다. – Dom

관련 문제