MySQL
Indizes und Schlüssel
Suche…
Syntax
- Erstellen Sie einen einfachen Index
CREATE INDEX Indexname ON Tabellenname ( Spaltenname1 [, Spaltenname2 , ...])
- Erstellen Sie einen eindeutigen Index
CREATE UNIQUE INDEX Indexname ON Tabellenname ( Spaltenname1 [, Spaltenname2 , ...)
- Index löschen
DROP INDEX index_name ON tabelle_name [ algorithm_option | lock_option ] ...
algorithm_option: ALGORITHM [=] {DEFAULT | INPLACE | COPY}
lock_option: LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
Bemerkungen
Konzepte
Ein Index in einer MySQL-Tabelle funktioniert wie ein Index in einem Buch.
Nehmen wir an, Sie haben ein Buch über Datenbanken und möchten Informationen zum Speicher finden. Ohne einen Index (vorausgesetzt, es gibt keine andere Hilfe, z. B. ein Inhaltsverzeichnis), müssen Sie die Seiten einzeln durchgehen, bis Sie das Thema gefunden haben (das ist ein "vollständiger Tabellenscan"). Auf der anderen Seite enthält ein Index eine Liste mit Schlüsselwörtern, sodass Sie den Index nachschlagen und feststellen können, dass Speicher auf den Seiten 113-120, 231 und 354 erwähnt wird. Dann könnten Sie diese Seiten direkt durchsuchen, ohne zu suchen (das ist eine Suche mit einem Index, etwas schneller).
Natürlich hängt der Nutzen des Index von vielen Faktoren ab - einige Beispiele, die das obige Gleichnis verwenden:
- Wenn Sie ein Buch über Datenbanken hatten und das Wort "Datenbank" indizierten, wird es möglicherweise auf den Seiten 1-59, 61-290 und 292-400 erwähnt. Das sind viele Seiten, und in einem solchen Fall ist der Index keine große Hilfe und es könnte schneller sein, die Seiten einzeln zu durchlaufen. (In einer Datenbank ist dies "schlechte Selektivität".)
- Bei einem 10-seitigen Buch ist es nicht sinnvoll, einen Index zu erstellen, da am Ende ein 10-seitiges Buch mit einem 5-seitigen Index anfangen kann, was einfach dumm ist - scannen Sie einfach die 10 Seiten und machen Sie es fertig .
- Der Index muss auch nützlich sein - generell gibt es keinen Sinn für die Indexierung, beispielsweise die Häufigkeit des Buchstabens "L" pro Seite.
Index erstellen
-- Create an index for column 'name' in table 'my_table'
CREATE INDEX idx_name ON my_table(name);
Erstellen Sie einen eindeutigen Index
Ein eindeutiger Index verhindert das Einfügen von duplizierten Daten in eine Tabelle. NULL
Werte können in die Spalten eingefügt werden, die Teil des eindeutigen Index sind (da sich ein NULL
Wert definitionsgemäß von jedem anderen Wert unterscheidet, einschließlich eines anderen NULL
Werts)
-- Creates a unique index for column 'name' in table 'my_table'
CREATE UNIQUE INDEX idx_name ON my_table(name);
Index löschen
-- Drop an index for column 'name' in table 'my_table'
DROP INDEX idx_name ON my_table;
Zusammengesetzten Index erstellen
Dadurch wird ein zusammengesetzter Index für beide Schlüssel, mystring
und mydatetime
und Abfragen mit beiden Spalten in der WHERE
Klausel werden beschleunigt.
CREATE INDEX idx_mycol_myothercol ON my_table(mycol, myothercol)
Hinweis: Die Reihenfolge ist wichtig! Wenn die Suchabfrage nicht beide Spalten in der WHERE
Klausel enthält, kann nur der Index ganz links verwendet werden. In diesem Fall wird eine Abfrage mit mycol
in der WHERE
den Index verwenden, wird eine Abfrage für die Suche myothercol
ohne auch für die Suche mycol
nicht. Weitere Informationen finden Sie in diesem Blogbeitrag .
Hinweis: Aufgrund der Arbeitsweise von BTREE sollten Spalten, die normalerweise in Bereichen abgefragt werden, den Wert ganz rechts einnehmen. Beispielsweise werden DATETIME
Spalten normalerweise abgefragt wie WHERE datecol > '2016-01-01 00:00:00'
. BTREE-Indizes behandeln Bereiche sehr effizient, jedoch nur, wenn die als Bereich abgefragte Spalte die letzte im zusammengesetzten Index ist.
AUTO_INCREMENT-Taste
CREATE TABLE (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY(id),
... );
Hauptanmerkungen:
- Beginnt mit 1 und erhöht sich automatisch um 1, wenn Sie es unter
INSERT
nicht angeben oder alsNULL
angeben. - Die IDs unterscheiden sich immer voneinander, aber ...
- Machen Sie keine Annahmen (keine Lücken, fortlaufend erzeugt, nicht wiederverwendet usw.), die sich auf die Werte der id beziehen, außer dass sie zu einem bestimmten Zeitpunkt eindeutig sind.
Subtile Notizen:
- Beim Neustart des Servers wird der Wert "next" als
MAX(id)+1
berechnet. - Wenn bei der letzten Operation vor dem Herunterfahren oder Absturz die höchste ID gelöscht wurde, kann diese ID erneut verwendet werden (dies ist von der Engine abhängig). Vertrauen Sie also nicht, dass auto_increments dauerhaft eindeutig ist . Sie sind zu jedem Zeitpunkt nur einzigartig.
- Für Multi-Master- oder Cluster-Lösungen siehe
auto_increment_offset
undauto_increment_increment
. - Es ist in Ordnung, etwas anderes als den
PRIMARY KEY
und einfachINDEX(id)
. (Dies ist in einigen Situationen eine Optimierung.) - Die Verwendung von
AUTO_INCREMENT
als "PARTITION
Taste" ist selten von Vorteil. mach etwas anderes. - Verschiedene Operationen können Werte "verbrennen". Dies geschieht, wenn Werte vorab zugewiesen werden und dann nicht verwendet werden:
INSERT IGNORE
(mit dup-Schlüssel),REPLACE
(DELETE
plusINSERT
) und andere.ROLLBACK
ist ein weiterer Grund für Lücken in IDs. - Bei der Replikation können Sie nicht darauf vertrauen, dass die IDs in aufsteigender Reihenfolge beim Slave ankommen. Obwohl die IDs in fortlaufender Reihenfolge zugewiesen werden, werden die InnoDB-Anweisungen in der
COMMIT
Reihenfolge an die Slaves gesendet.