In dem Artikel “Hast Du auch schön indexiert?” habe ich bereits vor ein paar Tagen über die Notwendigkeit berichtet, von den Index-Funktionen der MySql Datenbank-Engines gebrauch zu machen.
Nur wann entscheidet man sich für welche Indexform? Diese hier stehen für MyISAM (und bis auf Volltext auch für InnoDB) zur Verfügung:
- Allgemeiner Index (Index)
- Eindeutiger Index (Unique Index)
- Volltext Index (Fulltext Index)
Wichtig zu beachten ist, das MySql selbst entscheidet, wann es einen Index verwendet. Handelt es sich um eine Tabelle mit wenigen Tausend Datensätzen, ist es eventuell für MySql schneller, die Datensätze direkt zu durchsuchen, OHNE den Index anzusprechen. Ob und wenn ja welcher Index zum Einsatz kommt, ist abhängig von verschiedenen Faktoren. Welche das sind, erkläre ich in einem anderen Artikel.
Allgemeiner Index:
Der allgemeine Index ist der primitivste Index, den man verwenden kann. Mindestens ein konfigurierter Index sollte alle oft benutzen Spalten beinhalten, die für ein SELECT im Bedingunsbereich der JOINS (JOIN ON … AND … OR …) bzw. der WHERE Klausel (WHERE … AND … OR …) verwendet werden.
Das bedeutet den Geschwindigkeitsgewinn bei allgemeinen SQL Abfragen zu steigern.
Eindeutiger Index:
Der eindeutige Index ist in etwa das gleiche wie ein Primärschlüssel (oder umgedreht). Er ist für zwei Dinge gleichzeitig gut zu verwenden.
Einmal verhindert er - wenn gesetzt - das es zu Doppelbelegungen kommt. Denn bei einem eindeutigen Index (und das ist ja klar) darf ein Indexeintrag nur einmal vorkommen. Das beschert zu einem einen Geschwindigkeitsgewinn, weil JOINS eindeutig sind und zum anderen wahrt er die Datenintegrität (Vergleiche Artikel “Hast Du auch schön indexiert?” im praktischen Teil unten).
Volltext Index:
Der Volltext Index steht nur für die MyISAM-Storage-Engine von MySql zur Verfügung. Er indexiert Textinhalte, was für Volltextsuchen praktisch ist, die auf Live-Inhalten ausgeführt werden. Allerdings hat der Spass auch seine Grenze. Der Volltext Index erfasst im Falle von MyISAM nur die ersten paar hundert Zeichen, alles andere wird nicht indexiert. Also nicht wundern, wenn nur die Hälfte von einem großen Text auffindbar ist ;-)
Index über mehrere Spalten:
Einen Index kann man auch über mehrere Spalten setzen. Das ist mehr oder minder eine kombinationsfähige Ergänzung zu den Linktypen, die oben gelistet sind. Da stellen sich schnell zwei Fragen:
- Wie funktioniert das?
- Wann brauche ich das?
Im Artikel “Hast Du auch schön indexiert?” wird ganz unten erläutert, wie man einen Index über mehrere Spalten anlegt. Aber wann sollte man einen Index über mehrere Spalten setzen?
Ein kleines Beispiel ist hier bestimmt hilfreich. Ich gehe von einer Rezept-Datenbank aus, in welcher die Rezepte jeweils eine Rezept-Gruppe (z.B. Suppen) und einem Schwierigkeitsgrad zugeordnet sind (z.B. 1 bis 6, 1 ist einfach). Eine denkbare Abfrage wäre als, zeige mir alle Datensätze aus Suppen (mit der fiktiven ID 21) die den Schwierigkeitsgrad 3 haben.
So könnte eine Abfrage aussehen:
SELECT * FROM `rezepte` WHERE `gruppe` = 21 AND `level` = 3
Hier wäre es angebracht, einen Index auf mehrere Spalten zu setzen: nämlich auf die Spalten “Gruppe” und “Level”. Als Indextyp kommt nur einer in Frage: der allgemeine Index. Der eindeutige Index fällt raus, weil ja mehrere Rezepte in einer Gruppe das selbe Level haben können. Volltext ist auch indiskutabel, weil es ja gar keinen Text gibt, den es zu indexieren gilt.
Ein anderes Beispiel wäre aus einer Benutzerdatenbank. Ein Benutzer (Spalte “benutzer_id”) kann in mehreren Gruppen (Spalte “gruppen_id”) sein, aber nur einmal in einer Gruppe. Dafür benutzt man in der Regel eine Link-Tabelle. Dafür sähe ein SELECT wie folgt aus:
SELECT * FROM `benutzer_gruppen_link` WHERE `user_id` = 13
Als Index kommen in diesem Fall zwei in Betracht: Der allgemeine und der eindeutige Index. Besser ist der eindeutige Index, weil er garantiert, das ein Benutzer zwar in mehreren Gruppen gleichzeitig Mitglied sein, jedoch in einer Gruppe nur einmal vertreten sein kann. Dem allgemeinen Index wäre das egal, der indexiert alles.

















