Ist es eine korrekte Methode, die TEXT-Spalte der MySQL-Datenbank zu indizieren?

9

Ich habe eine Karte von Strings zu ganzen Zahlen. Um diese Karte in einer MySQL-Datenbank zu speichern, habe ich die folgende Tabelle erstellt:

%Vor%

Ich habe den TEXT-Typ für das Argument gewählt, weil seine Länge unvorhersehbar ist, der längste Datensatz hat derzeit 2290 Zeichen und die durchschnittliche Länge beträgt 88 Zeichen.

Nachdem ich die Performanceprobleme erreicht hatte, versuchte ich den Index in Argument Spalte hinzuzufügen, fand aber, dass ich die Länge angeben musste. Um diese Einschränkung zu vermeiden, fügte ich eine neue Integerspalte mit Hashwerten hinzu (md5 oder sonst) von Argument Spaltenwerten.

%Vor%

Und kombinierter Index

%Vor%

Seit dieser Zeit sind die Probleme mit der Leistung verschwunden. Ich würde gerne fragen, ob es ein richtiger Weg ist, dieses Problem zu lösen.

    
Rystsov Denis 15.02.2010, 23:02
quelle

1 Antwort

3

Ich glaube nicht, dass es einen "richtigen" Weg gibt, es hängt davon ab, wofür Sie die Spalte verwenden.

Nach meiner Erfahrung ist es ungewöhnlich, dass Sie in einer großen Textspalte auswählen müssen / wollen; der Text ist normalerweise Daten, die durch einen anderen Schlüssel abgerufen werden (es sei denn, es wird anders indiziert - zB Volltext, Lucene - aber das scheint nicht das zu sein, was Sie tun)

Wenn Sie tatsächlich eine exakte Übereinstimmung in einem großen Feld benötigen, ist es möglicherweise effizienter, den Hash zu verwenden, da Sie dadurch den Index wahrscheinlich kleiner halten. Meine Vermutung ist, dass, wenn Sie eine Indexgröße verwenden müssen, die größer ist als die Größe des Hash (hängt davon ab, wie nahe der Anfang des TEXT die Werte im Allgemeinen abweichen), verwenden Sie den Hash.

Ihre beste Wette ist es, es zu versuchen und zu sehen. Profilieren Sie beide Ansätze mit repräsentativen Daten und finden Sie heraus.

    
Brenton Alker 15.02.2010 23:15
quelle

Tags und Links