Der MySQL/MariaDB Datentyp ENUM ist vielen Anwendern unbekannt. Manchmal kann dieser Typ aber hilfreich sein. Wir möchten an dieser Stelle klären, wann sich ein Einsatz von ENUM lohnt und was die Vor- und Nachteile dieses Datentyps sind.
Der String, das unbekannte Wesen!
Bei der Arbeit mit String-Daten ist es manchmal wichtig sicherzustellen, dass in den Spalten Ihrer Tabellen nur fachlich gültige, also bekannte und bereits definierte Daten gespeichert werden. Eine Möglichkeit, dies zu erreichen, ist die Verwendung von ENUMs, mit der Sie eine vordefinierte Liste zulässiger Werte für eine Spalte festlegen können. So ist in einem Anwendungsfall ggf. fachlich klar, dass in der Spalte „Anrede“ in einer Tabelle „person“ nur die Strings „Frau“, „Herr“ und „divers“ zulässig sein sollten. Natürlich könnte man dies auch über eine Fremdschlüsselbeziehung, eine weitere Normalisierung, lösen (Anlegen einer Tabelle „Anreden“ mit einem Primärschlüssel und den Strings für die gewünschten Werte). Auch die Nutzung eines „Check-Constraints“ wäre sicherlich denkbar. In diesem Blog soll aber nun einmal der Datentyp ENUM vorgestellt werden.
Ein „stringentes" Beispiel
Um das Thema besser erklären zu können, brauchen wir ein Beispiel. Nehmen wir einmal an, dass wir in unserem Datenmodell (natürlich historisch gewachsen) eine (hier verkürzte) Tabelle mit Kundeninformationen haben. Hier besteht diese nur aus den folgenden Spalten:
- p_id (Primärschlüssel)
- anrede
- nachname
Ein paar weitere Eckdaten zu der Tabelle, die ggf. im Laufe des Beitrages noch interessant werden könnten:
Die Tabelle ist ca. 8,5 MB groß, hat eine durchschnittliche Satzlänge von 89 Bytes, besitzt ca. 100.000 Datensätze und wird von der Engine InnoDB verwaltet.
(E)nummerier das doch einfach.
In unserem Beispiel werden wir nun das VARCHAR-Feld „anrede“ in ein ENUM-Attribut konvertieren:
Was hat dies nun direkt für Folgen für die oben erhobenen „Eckdaten“:
Wie wir sehen, ist die Größe der Tabelle entscheidend kleiner geworden. Ohne in die Details zu gehen, sei hier angemerkt, dass dies mehrere Vorteile hat:
- Speicherplatz (auf Platte) wird gespart.
- Die Satzlänge ist deutlich kürzer geworden. Damit passen mehr Informationen in eine MySQL-Page (Block). Pro I/O-Vorgang können nun deutlich mehr Datensätze bewegt werden.
- Auch im Speicher (InnoDB Buffer) können jetzt mehr Daten (da diese ja pro Satz kleiner geworden sind) gehalten werden.
- Daten werden validiert (siehe nächstes Code-Beispiel).
Unbekannte Werte (z. B. neue Anreden wie „Firma“) können nun nicht mehr ad hoc gespeichert werden. Sollte in unserem Fall auch die „Firma“ als Anrede zulässig sein, so muss nun erst eine Schema-Änderung mittels ALTER TABLE Kommando vorgenommen werden.
Eine Frage der Organisation?
Auch hinter den Kulissen hat sich etwas (technisch) verändert. Springen wir noch einmal in der Zeit zurück, zu dem Moment als die Spalte „anrede“ noch den Datentyp VARCHAR verwendet hatte.
Das folgende Kommando hätte das untenstehende Ergebnis geliefert:
Nach der Änderung auf den Datentypen ENUM sieht das Ergebnis wie folgt aus:
Sehen sie den Unterschied? Die Sortierreihenfolge hat sich geändert:
- Die VARCHAR Spalte wird alphanumerisch sortiert.
- Die ENUM-Spalte legt für jeden String einen numerisch aufsteigenden Wert (beginnend mit 1) fest und sortiert die Strings gemäß der entsprechenden Zuweisung. Diese entspricht der Reihenfolge bei der Deklaration („Frau“ => 1, „Herr“ => 2, „divers“ =>3)
Dies kann man auch per SELECT beweisen:
Fazit: Alles nur String-Theorie?
ENUMs in MySQL sind eine leistungsstarke Funktion, die das Datenbankdesign vereinfacht, die Sicherheit erhöht und die Lesbarkeit verbessern kann. Mit einer vordefinierten Liste zulässiger Werte für eine Spalte und einer manchmal deutlichen Reduzierung des Platzbedarfes sind die Vorteile von ENUMs klar. Es ist jedoch auch wichtig, die Einschränkungen und potenziellen Nachteile der Verwendung von ENUMs zu beachten, z. B. die Notwendigkeit, das Schema zu ändern, wenn sich die zulässigen Werte ändern. Insgesamt können ENUMs, wenn sie richtig verwendet werden, ein wertvolles Werkzeug bei der Arbeit mit String-Daten sein. Ich selbst konnte bei Kunden bereits mehrfach Performanceprobleme durch den Einsatz von ENUM-Datentypen minimieren und oder lösen.
Sie haben Fragen zu MySQL und/oder MariaDB? Sprechen Sie mit uns. Wir beraten Sie gerne!
Seminarempfehlung
MYSQL ADMINISTRATION DB-MY-01
Zum Seminar