2012-10-08 9 views
0

Donc, j'ai une table bj10dcmegablast avec 20 millions de lignes. Maintenant, je veux faire une requête en tant queMySQL temps de fonctionnement

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; 

Je n'ai aucune idée de combien de temps cela va prendre. J'ai couru cette requête pendant une heure. Pas encore fini.

Je l'ai fait quelques tests:

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

Cela prend 40 secondes.

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

Celui-ci prend 2 minutes.

Tout le monde peut dire combien de temps durera la requête complète?

+0

Affichez les résultats de l'instruction EXPLAIN pour voir le plan d'exécution MySQL. – Namphibian

Répondre

0

La clause IN peut être inefficace dans MySQL. Essayez de faire cela avec une jointure explicite:

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; 

Dans cette version, vous n'avez pas besoin de l'alias de « middle1 », parce que vous regroupez déjà par les deux champs. Ils devraient être distincts.

+0

Merci. Je vais essayer! – NoviceCai

Questions connexes