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 als NULL 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 und auto_increment_increment .
  • Es ist in Ordnung, etwas anderes als den PRIMARY KEY und einfach INDEX(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 plus INSERT ) 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.


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow