0

したがって、2,000 万行のテーブル bj10dcmegablast があります。今、私は次のようにクエリを実行したい

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;

どれくらい時間がかかるかわかりません。このクエリを 1 時間実行しました。まだ終わっていません。

だから私はいくつかのテストを行いました:

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分かかります。

完全なクエリがどれくらい続くと思うか、誰でもわかりますか?

4

1 に答える 1

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;

このバージョンでは、既に 2 つのフィールドでグループ化されているため、"middle1" エイリアスは必要ありません。それらは異なる必要があります。

于 2012-10-08T14:15:55.233 に答える