6

Ich baue eine MySQL-Datenbank, die Einträge über spezielle Teilstrings der DNA in Hefearten enthält. Meine Tabelle sieht so aus:COUNT und GROUP BY auf Textfelder scheint langsam

+--------------+---------+------+-----+---------+-------+ 
| Field  | Type | Null | Key | Default | Extra | 
+--------------+---------+------+-----+---------+-------+ 
| species  | text | YES | MUL | NULL |  | 
| region  | text | YES | MUL | NULL |  | 
| gene   | text | YES | MUL | NULL |  | 
| startPos  | int(11) | YES |  | NULL |  | 
| repeatLength | int(11) | YES |  | NULL |  | 
| coreLength | int(11) | YES |  | NULL |  | 
| sequence  | text | YES | MUL | NULL |  | 
+--------------+---------+------+-----+---------+-------+ 

Es gibt etwa 1,8 Millionen Datensätze. In einer Art der Abfrage mag ich, wie viele DNA-Strings sehen, mit jeder Art von Art und Region verbunden sind, so dass ich ausgeben diese Abfrage:

select species, region, count(*) group by species, region; 

Die Art und Region Spalten hat nur zwei mögliche Einträge (konserviert/SCER für Arten und Promoter/Codierung für die Region) noch dauert diese Abfrage etwa 30 Sekunden.

Ist das eine normale Menge an Zeit für diese Art von Abfrage angesichts der Größe der Tabelle zu erwarten? Ist es langsam, weil ich Textfelder anstelle von einfachen Integer- oder booleschen Werten verwende (ich bevorzuge Textfelder, da mehrere Nicht-CS-Forscher die DB verwenden). Alle anderen Ideen und Vorschläge wären willkommen.

Bitte entschuldigen Sie, wenn dies eine knochenharte Frage ist, bin ich ein SQL-Neophyt.

P.S. Ich habe auch gesehen this question, aber die vorgeschlagene Lösung scheint nicht relevant für das, was ich tue.

EDIT: Die Konvertierung dieser Felder in VARCHARs reduziert die Laufzeit auf ~ 2,5 Sekunden. Hinweis: Ich habe es auch mit ENUMs zeitlich abgestimmt, die ein ähnliches Timing hatten.

+0

Welches Feld ist Ihr Primärschlüssel? –

+0

Ich habe keinen Primärschlüssel. Ich könnte das künstlich machen, aber wäre das wichtig? – Rich

Antwort

6

Warum werden alle Ihre stringbasierten Spalten als TEXT definiert? Wenn Sie den Leistungsvergleich lesen, sehen Sie, dass TEXT ~ 3x langsamer war als eine VARCHAR-Spalte mit identischer Indizierung: http://forums.mysql.com/read.php?24,105964,105964

+0

Guter Fang. Habe nicht bemerkt, dass sie' Text' waren. –

+0

Ich tat TEXT, weil ein Kollege von mir sagte, dass es keinen Unterschied zwischen diesem und VARCHAR geben würde :) Mit einem VARCHAR dauerte meine Laufzeit von 33 Sekunden auf 2.5 – Rich

+0

@Rich: Wow - hatte nicht erwartet einen so dramatischen Unterschied.Sie könnten niedriger werden, wenn Sie Die Spalte "Spezies und Region" wurde als Fremdschlüssel für Tabellen mit den entsprechenden Werten geändert. Ein INT ist immer 4 Byte, während VARCHAR (4) 5 ist, sodass Sie sich vorstellen können, wie viele Byte VARCHAR (100) enthält. –

3

Wenn Ihre Felder nur zwei Werte haben, sind Sie besser dran, sie zu booleschen Werten zu machen. Sie sollten auch alles NOT NULL machen, es sei denn, es gibt einen echten Grund, dass Sie es benötigen, um NULL zu sein.

Werfen Sie auch einen Blick auf die ENUM type für eine bessere Möglichkeit, eine endliche Anzahl von Menschen lesbare Werte für eine Spalte zu verwenden.

Was Langsamkeit betrifft, ist das erste, was zu versuchen ist, Indizes auf Ihren Spalten zu erstellen. Für die spezielle Abfrage sind zeigen Ihnen hier, ein Index für species, region sollte einen großen Unterschied machen:

create index on mytablename (species, region); 

sollte es tun.

+2

Sind Sie sicher, dass der Index bei solchen Daten mit geringer Kardinalität einen großen Unterschied machen wird? –

+1

Nein, ich bin mir nicht sicher, aber ich denke es ist eine gute Schätzung. Ich begann etwas über "EXPLAIN" zu schreiben, aber es begann sich in eine Dose Würmer zu verwandeln. Und ich denke, das Endergebnis wäre wahrscheinlich, dass wir versuchen sollten, einen Index zu erstellen. – Vineet

+0

Ich versuchte den Index, aber es machte keinen Unterschied. Ich habe auch versucht VARCHAR wie OMG Ponies vorgeschlagen, die viel schneller war. Danach versuchte ich es gegen Enums ohne merkliche Beschleunigung von VARCHARs. – Rich