CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEXindex_name
[USINGindex_type
] ONtbl_name
(index_col_name
,...) [WITH PARSERparser_name
]index_col_name
:col_name
[(length
)] [ASC | DESC]
CREATE INDEX
wird mit einer ALTER
TABLE
-Anweisung verknüpft, um Indizes zu erstellen.
Siehe auch Abschnitt 13.1.2, „ALTER TABLE
“. Weitere Informationen
dazu, wie MySQL Indizes verwendet, finden Sie in
Abschnitt 7.4.5, „Wie MySQL Indizes benutzt“.
Normalerweise erstellen Sie alle Indizes für eine Tabelle zu
dem Zeitpunkt, an dem Sie auch die Tabelle selbst mit
CREATE TABLE
anlegen. Siehe auch
Abschnitt 13.1.5, „CREATE TABLE
“. CREATE INDEX
erlaubt Ihnen das Hinzufügen von Indizes zu vorhandenen
Tabellen.
Eine Spaltenliste in der Form (col1,col2,...)
erstellt einen mehrspaltigen Index. Indexwerte werden gebildet,
indem die Werte der betreffenden Spalten verkettet werden.
Bei CHAR
-, VARCHAR
-,
BINARY
- und
VARBINARY
-Spalten können Indizes erstellt
werden, die nur einen Teil einer Spalte verwenden. Hier
verwenden Sie die Syntax
,
um die Länge des Indexpräfixes anzugeben. Indexeinträge
umfassen dann die ersten col_name
(length
)length
Zeichen jedes Spaltenwerts bei CHAR
- und
VARCHAR
-Spalten sowie die ersten
length
Bytes jedes Spaltenwerts bei
BINARY
- und
VARBINARY
-Spalten. BLOB
-
und TEXT
-Spalten lassen sich auch indizieren,
aber eine Präfixlänge muss angegeben
werden.
Die folgende Anweisung erstellt einen Index unter Verwendung der
ersten zehn Zeichen der Spalte name
:
CREATE INDEX part_of_name ON customer (name(10));
Wenn die ersten zehn Zeichen aller Namen in der Spalte sich
durchgehend unterscheiden, dann sollte dieser Index nicht viel
langsamer sein als ein Index, der aus der gesamten Spalte
name
erstellt wurde. Auch die Verwendung von
Teilspalten für Indizes kann die Indexdatei wesentlich kleiner
machen, wodurch sich viel Festplattenspeicher sparen lässt und
INSERT
-Operationen unter Umständen auch
beschleunigt werden können.
Präfixe können bis 1.000 Byte lang sein (767 Byte bei
InnoDB
-Tabellen). Beachten Sie, dass
Präfixbeschränkungen in Byte angegeben werden, wohingegen die
Präfixlänge in CREATE INDEX
-Anweisungen bei
nichtbinären Datentypen (CHAR
,
VARCHAR
, TEXT
) als Anzahl
der Zeichen interpretiert wird. Dies muss bei der Angabe einer
Präfixlänge für eine Spalte berücksichtigt werden, die einen
Multibytezeichensatz verwendet.
In MySQL 5.1 können Sie
einen Index für eine Spalte, die
NULL
-Werte enthalten kann, nur dann
hinzufügen, wenn Sie die Speicher-Engines
MyISAM
, InnoDB
,
BDB
oder MEMORY
verwenden,
einen Index für eine BLOB
- oder
TEXT
-Spalte nur dann hinzufügen, wenn
Sie die Speicher-Engines MyISAM
,
BDB
oder InnoDB
verwenden.
Eine index_col_name
-Definition kann
auf ASC
oder DESC
enden.
Diese Schlüsselwörter sind für zukünftige Erweiterungen
zulässig, um eine Speicherung der Indexwerte in auf- oder
absteigender Reihenfolge festzulegen. Zurzeit werden sie zwar
erkannt, aber ignoriert – Indexwerte werden immer in
aufsteigender Reihenfolge gespeichert.
Einige Speicher-Engines gestatten bei der Erstellung eines
Indexes die Angabe eines Indextyps. Die Syntax für die
Konfigurationsangabe index_type
lautet USING
. Zulässige Werte
für type_name
type_name
, die von den
verschiedenen Speicher-Engines unterstützt werden, sind in der
folgenden Tabelle aufgelistet. Sind mehrere Indextypen
aufgeführt, so wird der erste standardmäßig verwendet, wenn
keine Angabe für index_type
vorhanden ist.
Speicher-Engine | Zulässige Indextypen |
MyISAM |
BTREE |
InnoDB |
BTREE |
MEMORY /HEAP
|
HASH , BTREE
|
Ein paar Beispiele:
CREATE TABLE lookup (id INT) ENGINE = MEMORY; CREATE INDEX id_index USING BTREE ON lookup (id);
TYPE
kann als Synonym für type_name
USING
benutzt werden,
um einen Indextyp anzugeben. Allerdings ist
type_name
USING
die bevorzugte Form. Ferner ist der
Indexname, der in der Syntax zur Indexspezifikation vor dem
Indextyp steht, bei TYPE
nicht optional:
Anders als USING
ist TYPE
kein reserviertes Wort und wird infolgedessen nicht als
Indexname interpretiert.
Wenn Sie einen Indextyp angeben, der für eine gegebene Speicher-Engine nicht zulässig ist, aber ein anderer Indextyp vorhanden ist, den die Engine verwenden kann, ohne dass hiervon Abfrageergebnisse betroffen wären, dann verwendet die Engine diesen verfügbaren Typ.
FULLTEXT
-Indizes werden nur für
MyISAM
-Tabellen unterstützt und dürfen nur
CHAR
-, VARCHAR
- und
TEXT
-Spalten enthalten. Siehe auch
Abschnitt 12.7, „MySQL-Volltextsuche“. Eine WITH
PARSER
-Klausel kann angegeben werden, um ein
Parser-Plug-In mit dem Index zu verknüpfen, wenn
Volltextindizierungs- und Suchoperationen besondere Maßnahmen
erfordern. Diese Klausel ist nur für
FULLTEXT
-Indizes zulässig. Informationen zur
Erstellung von Plug-Ins finden Sie in
Abschnitt 26.2, „Die MySQL-Plug-In-Schnittstelle“.
SPATIAL
-Indizes werden nur für
MyISAM
-Tabellen unterstützt und dürfen nur
raumbezogene Spalten enthalten, die als NOT
NULL
definiert sind.
Kapitel 18, Raumbezogene Erweiterungen in MySQL, beschreibt raumbezogene
Datentypen.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.