2011-01-11 3 views
1

Ich bin zwei Tabellen beitreten. Tabelle unique_nucleosome_re hat etwa 600.000 Datensätze. Eine andere Tabelle hat 20.000 Datensätze. Die seltsame Sache ist die Leistung und die Antwort von EXPLAIN ist abhängig unter der Bedingung in der WHERE-Klausel. Als es war WHERE n.chromosome = 'X' dauerte es etwa 3 Minuten. Als es war WHERE n.chromosome = '2L' dauerte es mehr als 30 Minuten und die Verbindung ist weg.MySQL langsame Abfrage und EXPLAIN gab seltsame Antworten

SELECT n.name , t.transcript_start , n.start 
FROM unique_nucleosome_re AS n 
INNER JOIN tss_tata_range AS t 
ON t.chromosome = n.chromosome 
WHERE (t.transcript_start > n.end AND t.ts_minus_250 < n.start) 
     AND n.chromosome = 'X'  
ORDER BY t.transcript_start 
; 

Dies ist die Antwort von EXPLAIN. , wenn die WHERE

'1', 'SIMPLE', 'n', 'ALL', 'start_idx,end_idx,chromo_start', NULL, NULL, NULL, '606096', '48.42', 'Using where; Using join buffer' 

n.chromosome = 'X' ist, wenn die WHERE

'1', 'SIMPLE', 'n', 'ref', 'start_idx,end_idx,chromo_start', 'chromo_start', '17', 'const', '68109', '100.00', 'Using where' 

Die Anzahl der Datensätze für X oder 2L n.chromosome = '2L' ist fast gleich sind. Ich verbrachte die letzten paar Tage, aber ich konnte es nicht herausfinden. Es kann ein einfacher Fehler sein, den ich nicht sehen kann oder der ein Fehler ist. Können Sie mir helfen?

+0

Manchmal ist der Optimierer abgehört, so dass Sie einige unscharfe Ergebnisse haben. –

+0

Können Sie es auf einer anderen Version versuchen? (Ich bin ein langsamer Autor) –

+0

Leider ist jetzt keine andere Version bei mir verfügbar. Es ist MySQL Server 5.1.49-1ubuntu8.1 –

Antwort

0

Erstens, ohne Index Informationen zu sehen, würde ich einen Index auf Ihrem TSS_TData_Range auf dem Chromosom Schlüssel und transcript_start (aber ein Minimum der Chromosom Schlüssel). Ich würde auch annehmen, dass es einen Index auf Chromosom auf Ihrer unique_nucleosome_re Tabelle gibt. Dann scheint es, die TSS ist Ihr SHORT Tisch, so würde ich in die erste Position der Abfrage bewegen und die Verwendung der „STRAIGHT_JOIN“ Klausel berufen ...

SELECT STRAIGHT_JOIN 
     n.name, 
     t.transcript_start, 
     n.start 
    FROM 
     tss_tdata_range t, 
     unique_nucleosome_re n 
    where 
      t.chromosome = 'X' 
     and t.chromosome = n.chromosome 
     and t.transcript_start > n.end 
     and t.ts_minus_250 < n.start 
    order by 
     t.transcript_start 

ich in der Leistung interessiert sein würde Auch wenn es gut für Sie funktioniert ...

+0

Sie haben Recht in Bezug auf Indizes. Chromosom in beiden Tabellen und andere Schlüssel in WHERE sind indiziert. Ich werde es versuchen und dich wissen lassen. :) –

+0

Hmmm ,,, Der erste dauerte 17 Sekunden und der zweite dauerte 37 Sekunden, wenn beide durch 10 begrenzt. Ich habe den Server vor dem Profiling neu gestartet, um den Cache zu beseitigen. –

+0

@microbe guter Punkt auf Server aktualisieren und Cache, aber ich denke, Sie finden es immer noch etwas konsistent für Sie ... Froh, zu helfen ... einige Leute nicht erkennen, die Macht, die STRAIGHT_JOIN für Sie tun kann, besonders wenn Sie WISSEN Sie Ihre Daten und die Beziehungen ... – DRapp