|
|
-
---------------
-
-
-
-
---------------
-
-
-
---------------
-
-
-
-
-
-
-
-
-
-
---------------
-
-
-
-
---------------
-
-
-
-
|
|
|
|
|
|
|
| |
|
57972 Seitenaufrufe |
|
INDEX / INDIZIES in MySQL
Bedeutung:
Indizes legt man an um schneller auf die Daten in einer Tabelle zugreifen zu können.
Dies gilt allerdings nicht für Abfragen, die den kompletten Inhalt einer Tabelle abfragen.
Mit Indizes lassen sich Abfragen an die Datenbank erheblich beschleunigen.
Faktor 1000 bis 1000000 (!) sind keine Seltenheit.
Anlegen eines INDEX:
Wie man einen INDEX bzw. mehrere INDIZIES anlegt und löscht ist unter
ALTER TABLE beschrieben.
Hier nochmal die allgemeine Form um einen INDEX anzulegen:
ALTER TABLE tabelle ADD INDEXTYP indexName (feld1, feld2, feld3) |
Typen von INDIZES:
MySQL unterscheidet vier Typen von INDIZES:
-
INDEX:
Ein 'normaler' INDEX
-
UNIQUE:
wie INDEX, mit der Bedingung, dass jeder Wert in dem indexierten Feld nur einmal vorkommt,
also einzigartig (unique) ist
-
PRIMARY KEY:
wie UNIQUE, einziger Unterschied ist der, dass pro Tabelle nur ein einziger PRIMARY KEY
zugelassen ist. Typischerweise verwendet man hierfür AUTOINCREMENT-Felder.
-
FULLTEXT:
Eine noch relativ neue Index-Variante von MySQL. Mit ihr lassen sich sehr große Textmengen
indizieren und später wieder sehr schnell abfragen. Näheres dazu unter unter anderem unter
FUNKTIONEN, ALTER TABLE und FULLTEXT.
Der Typ FULLTEXT soll in der Version 4.01 und folgende noch weiter ausgebaut werden.
U.a. werden dann auch Suchen mit boolschen Operatoren unterstützt (->FULLTEXT).
Welche Felder sollen indexiert werden?
Bei der Auswahl der Felder für das Anlegen eines Indizes sind als erstes die Felder zu berücksichtigen,
die häufig innerhalb einer WHERE-Bedingung abgefragt werden.
Als weitere Kandidaten für die Indexierung kommen die Felder in Frage, auf die per
ORDER BY
oder
GROUP BY zugegriffen wird.
Ganz besonders wichtig ist es, die Felder mit einem INDEX zu belegen, die in einer
Kreuzabfrage (Abfragen mehrerer Tabellen in einem Statement)
auf ihren Wert abgeprüft werden. Hier sind die größten Geschwindigkeitsverbesserungen zu erwarten.
Beispiel:
SELECT eins.feld1, eins.feld2, zwei.feld1
FROM tabelle1 eins, tabelle2 zwei
WHERE eins.feld2 = zwei.feld1
|
Hier würde es Sinn machen, das Feld feld2 aus Tabelle tabelle1 und das Feld feld1 aus Tabelle tabelle2
jeweils mit einem INDEX zu belegen.
Bei der Indexierung von Text- oder Blob-Feldern sollte man vorsichtig sein. Selbst wenn man das Textfeld indexiert ist
der Geschwindigkeitsvorteil unter Umständen nur gering. Häufig ist es besser, nur einen Teil des Feldes zu indexieren
(z.B. nur die ersten 100 Zeichen).
Ist man sich sicher, das jeder Wert in einem Feld nur einmal vorkommt so sollte man als Indextyp UNIQUE wählen.
MySQL kann so schneller auf die Werte in dem INDEX / Feld zugreifen.
Grundsätzlich gilt:
- Je weniger gleiche Werte es in einem Feld einer Tabelle gibt desto mehr eignet sich das Feld für einen INDEX.
- Bei Kreuzabfragen werden die Abfragen am schnellesten abgearbeitet,
bei denen die zu vergleichenden Felder vom selben Feldtyp sind. Im letzten Beispiel wäre es zum Beispiel optimal, wenn
feld2 und feld1 beide vom Typ INTEGER(8) oder vom Typ CHAR(4) wären und jeweils mit einem INDEX belegt wären.
- Bei Feldern mit sehr großem Inhalt kann es sinnvoller sein, nur einen Teil des Feldes mit einem Index zu belegen (z.B. nur die ersten 100 Zeichen).
Der von MySQL angelegte INDEX wird dann nicht so groß und kann daher schneller durchsucht werden.
-
Sollen sehr große Textmengen (bis zu mehreren hundert MB) indiziert werden so empfiehlt sich die Indizierung als FULLTEXT.
Bei relativ kleinen Textmengen sollte man hiervon jedoch keinen Gebrauch machen da die Abfragen an diesen Indextyp dann zu sehr
eigenartigen Ergebnissen führen kann.
|