2012-10-08 3 views
0

그래서 2 천만 행이 포함 된 테이블 bj10dcmegablast가 있습니다. 이제 쿼리를 수행하고 싶습니다.MySQL 실행 시간

select *, max(qEnd - qStart) 
from 
    (select qFileID,qLocus,qTranscript,qLength,sFileId,sLocus,sTranscript, 
sLength,qStart,qEnd,sStart,sEnd 
     from bj10dcmegablast 
     where (qLocus, qTranscript) 
     in  
     (select distinct qLocus, qTranscript 
    from 
     (select qLocus, qTranscript, count(distinct sFileID) as counts 
     from bj10dcmegablast 
     group by qLocus, qTranscript 
     having counts > 6) as middle1)) as middle2 
group by qLocus,sLocus; 

얼마나 오래 걸릴지는 모르겠습니다. 한 시간 동안이 쿼리를 실행했습니다. 아직 끝나지 않았다.

select qLocus, qTranscript, count(distinct sFileID) as counts 
from bj10dcmegablast 
group by qLocus, qTranscript 
having counts > 6 

이 40 초 정도 걸립니다 :

그래서 몇 가지 테스트를했다.

select distinct qLocus, qTranscript 
from 
    (select qLocus, qTranscript, count(distinct sFileID) as counts 
    from bj10dcmegablast 
    group by qLocus, qTranscript 
    having counts > 6) as middle1; 

이것은 2 분이 걸립니다.

누구나 전체 쿼리가 지속될 것이라고 생각할 수 있습니다.

+0

MySQL 실행 계획을 살펴볼 수 있도록 EXPLAIN 문의 결과를 게시하십시오. – Namphibian

답변

0

IN 절은 MySQL에서 비효율적 일 수 있습니다. 명시 적으로이 일을 시도 가입 :

select *, max(qEnd - qStart) 
from (select qFileID, qLocus, qTranscript, qLength, sFileId, sLocus, sTranscript, 
      sLength, qStart, qEnd, sStart, sEnd 
     from bj10dcmegablast 
    ) b join 
    (select qLocus, qTranscript, count(distinct sFileID) as counts 
     from bj10dcmegablast 
     group by qLocus, qTranscript 
     having counts > 6 
    ) as middle2 
    on b.qLocus = middle2.qLocus and b.qTranscript = b.qTranscript 
group by qLocus, sLocus; 

를이 버전에서는, 당신은 이미 두 개의 필드로 그룹화하고 있기 때문에 당신은 "middle1"별명이 필요하지 않습니다. 그들은 분명해야합니다.

+0

감사합니다. 나는 시도 할 것이다! – NoviceCai