2011-01-08 9 views
0

Ich verwende derzeit enums als TINYINTs in MySQL-Datenbank. Meine Tische haben ein paar Millionen Zeilen in ihnen. Wir ordnen dann die Enums von TINYINT Strings anderswo zu.Verwenden von String-Enums in MySQL - Leistungsfrage

Ich überlege, diese enums als Strings zu speichern. Wenn die Strings ordnungsgemäß indiziert sind, weiß jemand, wie MySQL bei der Abfrage von String-Enums anstelle von TINYINT-Enums vorgeht?

Schätzen Sie die Hilfe. Vielen Dank.

+0

Can Sie klären, ob Sie den MySQL-Datentyp ENUM (http://dev.mysql.com/doc/refman/5.0/en/enum.html) verwenden oder nicht? – Nishant

Antwort

0

TINYINT (oder INTEGER zu diesem Zweck) ist schneller indiziert und gibt eine bessere Leistung in SORT oder SELECTs als VARCHAR oder CHAR.

Also, um Sie zu beantworten, yeah Strings sind richtig indiziert, aber die Leistung kann sinken. Ich kann nicht sagen, wie bedeutend das wäre.


Edit 1 weitere Informationen

Scheint, wie kleinere VARCHAR und INTEGER vernachlässigbaren Unterschied in der Leistung bei der Indizierung hat. Sehen Sie hier http://forums.mysql.com/read.php?115,251611,252006#msg-252006

1

(Angenommen, Sie TINYINT verwenden und eine Lookup-Tabelle haben) TINYINT schneller ist, aber Sie könnten am Ende einige Performance zu sehen, trifft wegen verbindet.

Mein Tipp, wenn sich Ihre Aufzählungswerte nicht ändern (zB - Männliche, weibliche Typen, ja keine Arten von Aufzählungen), verwenden Sie stattdessen das MYSQL ENUM Feld. Es wird mit 1 Byte gespeichert (wenn Aufzählungswerte kleiner als 255 sind) und benötigt keine Joins.

Aber seien Sie gewarnt und lesen Sie alle Vor- und Nachteile der ENUM-Datentypen, bevor Sie den Sprung wagen.

3

Enums werden so gespeichert, als ob es eine Nachschlagetabelle gäbe, also wird nur eine numerische Referenz in jeder Zeile gespeichert, mit einer Nachschlagetabelle an anderer Stelle. Technisch gesehen ist die Übereinstimmung mit dem Ganzzahlwert einer Enumeration so schnell wie die Übereinstimmung mit einer Ganzzahl, da die beiden identisch sind, und die Übereinstimmung eines Zeichenfolgenwerts ist marginal langsamer (in allen Fällen Balken eins), einfach weil nur eine weitere "Suche" durchgeführt wird die Nachschlagetabelle, um den ganzzahligen Wert zu finden, der dann zum Ausführen der Suche verwendet wird.

Diese eine Instanz ist, wenn Sie nach einem Wert suchen, der nicht existiert, versuchen Sie, den numerischen Wert von enum für einen Wert zu vergleichen, der nicht existiert, und es wird immer noch alle Daten durchsuchen, aber versuchen Sie a String-Wert, der nicht existiert, und eine kleinere Suche durch die Nachschlagetabelle ist erfolgt, wobei keine Übereinstimmung zurückgegeben wird, bevor irgendwelche Daten durchsucht werden.

Verwenden Sie keine Enums für "Ja/Nein" - oder "Männlich/Weiblich" -Antworten, da die numerischen Daten und die Suchtabelle viel mehr Platz benötigen als ein "Bit" -Wert (0 oder 1). Verwenden Sie auch keine numerischen Zeichenfolgen in der Enum-Definition, z. enum ("1", "0"), da dies für jeden verwirrend ist, der den Code und die Abfrage betrachtet (weil die gespeicherte Nachschlagetabelle [0 => "1", 1 => "0"] ist)