2012-02-20 2 views
3

테이블에 ~ 2M 행이 있습니다. B-tree 프라이 머리 키 (id, round)와 2 개의 다른 (무관 한 것 같다) 인덱스가 있습니다.쿼리 최적화 삽입

내 질문은 다음과 같습니다

insert into a1 
select * from cars 
where (id, round) in (select id, min(round) from cars group by id) 

위의 쿼리는 를 실행 ~ 30 대를 취할 것입니다 만 왜 다음 쿼리

insert into a1 
select * from cars 
where (id, round) in (select id, max(round) from cars group by id) 

실행 영원히 걸릴 것 같다? 나는 몇 시간을 기다렸다. 내가 변화하는 유일한 것은 min-> 최대에게 있습니다

PS : 여기에 생성 테이블입니다

CREATE TABLE `cars` (
    `id` int(11) NOT NULL, 
    `make` varchar(128) NOT NULL, 
    `miles` varchar(128) NOT NULL, 
    `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `round` int(11) NOT NULL, 
    `location` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`id`,`round`), 
    KEY `time` (`time`), 
    KEY `make` (`make`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
+1

서브 쿼리가'id'보다는'round'에 의해 그룹화되는 이유는 무엇입니까? 이 경우 id는 임의적이라는 것을 알고 있습니까? 맞습니까? –

+0

'(id round) in (round로 자동차 그룹에서 min을 선택하십시오)'및 (id round)에서 (select id, max) 자동차에서 extended select *를 설명하십시오. (라운드)에서 자동차 그룹에서)' – penartur

+0

미안 해요, 이드이어야합니다. –

답변

2

IN 하위 쿼리는 현재 MySQL 쿼리 최적화 프로그램에서 최선의 방법으로 최적화되지 않았습니다.

내가 사용합니다 : 이미 (id, round)에있는

INSERT INTO a1 
    SELECT c.* 
    FROM 
     cars AS c 
    JOIN 
     (SELECT id, MAX(round) AS round 
      FROM cars 
      GROUP BY id 
     ) AS m 
     ON (m.id, m.round) = (c.id, c.round) 

인덱스는 하위 쿼리 (파생 테이블로) 한 번만 꽤 빨리 실행하게됩니다. 다른 방법으로, IN을 사용하면 서브 테이블은 cars 테이블의 모든 행에 대해 한 번 실행됩니다 (느린 이유입니다). 실행 계획을 EXPLAIN으로 확인하십시오.

+0

@Tao : 빠르게 작동 했습니까? –

0

방법

"에 의해 그룹"당신이 당신의 단일 필드를 사용하는 id 필드 에 하나의 인덱스를 만드십시오
+0

그는'(id, round)'에 이미 색인을 가지고 있습니다. 이것은 'GROUP BY'에 의해 사용될 수있다. –