Home
SQL / MySQL
Datenbanken?
  ---------------
Select
Insert
Update
Delete
  ---------------
Where
Order By
Group By
  ---------------
Create Table
Alter Table
Rename Table
Drop Table
Optimize Table
Repair Table
Backup Table
Restore Table
Show Tables
Describe Table
  ---------------
Use DB
Create DB
Drop DB
Show DBs
  ---------------
Funktionen
Indizes
Fulltext
Feldtypen
Gästebuch
Download
Kontakt
 
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.



 
Letzte Änderung: 17. Mai 2002, 22:26 Uhr


© 2002, Klaus Becker, becker-k@web.de