Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Leistung:MySQL/MariaDB-Indizes

Daten in einer MySQL/MariaDB-Datenbank werden in Tabellen gespeichert. Eine einfache Art, über Indizes nachzudenken, besteht darin, sich eine umfangreiche Tabellenkalkulation vorzustellen. Diese Art von System ist einer schnellen Suche nicht immer förderlich; Hier wird ein Index unerlässlich. Wenn kein Index vorhanden ist, muss die Datenbank-Engine bei Zeile eins beginnen und alle Zeilen durchsuchen, um nach den entsprechenden Werten zu suchen. Wenn dies eine kleine Tabelle ist, dann ist das keine große Sache, aber in größeren Tabellen und Anwendungen, wo es Tabellen mit Millionen und sogar Milliarden von Zeilen geben kann, wird es problematisch. Wie Sie sich vorstellen können, ist das Durchsuchen dieser Zeilen einzeln zeitaufwändig, selbst auf der neuesten Hardware. Die Lösung besteht darin, einen INDEX (oder mehrere) für Ihre Daten zu erstellen.

Was ist ein Index?

Ein Index ist eine organisierte Nachschlagetabelle, die Zeiger darauf enthält, wo Daten in der Datenbank abgerufen werden können. Dieses Konzept ähnelt Buchindizes. In einem Buch listet der Index Seitenzahlen auf, auf denen sich verschiedene Themen befinden. In einer Datenbank speichert der Index Zeiger, die sich in einer logischen und sortierten Reihenfolge befinden, was ein schnelles Nachschlagen in der Datenbank ermöglicht. Stellen Sie sich ein Buch ohne Index vor. Wenn Sie Informationen zu einem bestimmten Thema nachschlagen möchten, müssen Sie am Anfang beginnen und die Seiten durchblättern, bis Sie die gesuchten Informationen gefunden haben. Ein Buchindex löst dieses Problem, indem er Ihnen genau sagt, auf welchen Seiten sich die gesuchten Informationen befinden. So funktioniert im Wesentlichen ein MySQL-Index.

Wann verwendet MySQL Indizes?

Jedes Mal, wenn der Datenbankserver Informationen nachschlagen muss, verwendet er einen Index, um den Prozess zu beschleunigen. Beispiele hierfür sind WHERE-, JOIN ON-, MIN/MAX- und ORDER BY/GROUP BY-Klauseln. Wenn Ihre Abfragen in einer dieser Situationen häufig nach einer Spalte suchen oder übereinstimmen, sollten Sie erwägen, einen Index zu erstellen.

Verbessern Indizes die Datenbankleistung?

Meistens lautet die kurze Antwort ja. Beim Lesen und Durchsuchen der Daten erhöhen Indizes absolut die Performance. Wenn Sie keine vollständigen Tabellenscans durchführen, verbessert sich so gut wie jede SELECT-Abfrage. Dies kommt zu einem kleinen Preis. Bei Spalten, die häufig manipuliert werden, fallen für jede Änderung Kosten an. Dies kann INSERTs und UPDATEs in der Datenbank blockieren.

Häufige MySQL-Indextypen

Es gibt drei gängige Typen von MySQL-Indizes:

  • Primärschlüssel
  • Index
  • Einzigartig

PRIMÄRSCHLÜSSEL

Ein Primärschlüssel teilt dem Datenbankserver mit, welches die wichtigste(n) Spalte(n) in der Tabelle sind. Normalerweise wird dies für auto_increment-ID-Spalten verwendet. Wenn Sie beispielsweise eine Tabelle mit Mitarbeiterinformationen haben, möchten Sie einen Primärschlüssel für die Spalte „EMPLOYEE_ID“. In anderen Tabellen, z. B. einer Gehaltstabelle, würden Sie statt aller Daten des Mitarbeiters einfach auf die EMPLOYEE_ID verweisen.

INDEX

Ein Standard-INDEX wird verwendet, um dem Datenbankserver mitzuteilen, dass eine oder mehrere Spalten in der Tabelle häufig durchsucht werden und daher ein Index für sie erstellt werden sollte. Dies kann während der Tabellenerstellung erstellt werden oder wenn Sie später feststellen, dass Sie einen Index für eine Spalte benötigen, kann er dann hinzugefügt werden.

EINZIGARTIG

Ein UNIQUE-Index unterscheidet sich ein wenig dadurch, dass er bestimmte Beschränkungen dafür auferlegt, was in die Tabelle geschrieben werden kann. Wenn Sie versuchen, eine Zeile einzufügen, die einen Wert enthält, der bereits in den Daten enthalten ist, erzeugt INSERT einen Fehler. Dies ermöglicht eine schnelle Suche sowie eine gewisse Datenintegrität.

So erstellen Sie einen Index

Es gibt mehrere Möglichkeiten, einen Index für eine Spalte zu erstellen. Sie können einen Index einrichten, wenn Sie CREATE TABLE oder danach mit den Anweisungen ALTER TABLE oder CREATE INDEX aufsetzen.

Erstellen eines PRIMARY KEY Index

Der einfachste Weg, einen PRIMARY KEY-Index zu erstellen, besteht darin, dies beim Erstellen der Tabelle zu tun. Für dieses Tutorial verwenden wir ein Beispiel einer Mitarbeitertabelle. Die Tabelle hat drei Spalten:ID, FIRSTNAME und LASTNAME. Das Erstellen kann etwa so aussehen:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32)
);

Diese Anweisung erstellt die Tabelle ohne Index. Wir können den Primärschlüssel mit einer Anweisung wie dieser hinzufügen:

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT PRIMARY KEY (ID);

Dies teilt MySQL mit, dass wir einen Primärschlüssel für die Spalten-ID haben.

Eine einfachere Möglichkeit, dies zu tun, ist während der Erstellung der Tabelle. Von vorne beginnend, erstellen wir die Tabelle neu und fügen den Primärschlüssel in einer Anweisung hinzu.

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Diese einzelne Anweisung führt die gleichen Aufgaben aus wie die ersten beiden Anweisungen oben. Ein Primärschlüssel kann mehr als eine Spalte enthalten, aber die Spalten müssen alle eindeutig sein. Der Primärschlüssel kann verwendet werden, um jede einzelne Zeile in der Tabelle zu identifizieren.

Erstellen eines Indexes mit CREATE INDEX

Stellen Sie sich anhand der obigen Beispieltabelle vor, dass das Unternehmen Tausende von Mitarbeitern hat und Sie die Mitarbeiter schnell nach dem Nachnamen suchen möchten. Bei einem Primärschlüssel kann es nur einen Eintrag geben. Sie können nicht mehrere Personen haben, die dieselbe Mitarbeiter-ID haben. Bei Nachnamen ist es durchaus üblich, dass mehrere Personen diesen Namen teilen. Auch hier gibt es einige Möglichkeiten, dies zu tun. Verwenden Sie die obige Tabelle:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Wir können der Spalte NACHNAME wie folgt einen Index hinzufügen:

CREATE INDEX idx1 ON EMPLOYEE (LASTNAME);

Die Suche nach NACHNAME ist in dieser Tabelle jetzt schneller. In diesem Beispiel ist „idx1“ der Name des Index. Dies erleichtert es, in Zukunft bei Bedarf auf den Index selbst zu verweisen.

Eine andere Möglichkeit, einer Tabelle einen Index hinzuzufügen, ist der ALTER TABLE-Befehl. Um dasselbe zu erreichen wie mit der vorherigen Anweisung, würden wir den folgenden Befehl ausführen:

ALTER TABLE EMPLOYEE ADD INDEX idx1 (LASTNAME);

Die letzte Möglichkeit, einen Index hinzuzufügen, der etwas Zeit sparen würde, besteht darin, dies während CREATE TABLE zu tun. Wenn Sie im Voraus wissen, dass Sie eine bestimmte Spalte suchen oder verknüpfen werden, können Sie die Anfangstabelle mit dem bereits vorhandenen Index erstellen:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx1 (LASTNAME)
);

Alle drei dieser Anweisungen erzeugen das gleiche Ergebnis.

Mehrspaltige Indizes

Ein Index muss sich nicht nur auf einer einzelnen Spalte befinden. Wenn wir sowohl FIRSTNAME als auch LASTNAME schneller suchen möchten, können wir einen Index für beide Spalten erstellen. In der Tabellenerstellung würde das so aussehen:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx2 (LASTNAME,FIRSTNAME)
);

Verwenden des CREATE INDEX-Befehls:

CREATE INDEX idx2 ON EMPLOYEE (LASTNAME, FIRSTNAME);

Und schließlich der ALTER TABLE-Befehl:

ALTER TABLE EMPLOYEE ADD INDEX idx2 (LASTNAME, FIRSTNAME);

Erstellen eines EINZIGARTIGEN INDEX

Es kann vorkommen, dass Sie einen Index für eine Spalte erstellen und auch erzwingen möchten, dass alle Einträge in dieser Spalte eindeutig sind. Wenn wir unsere Beispieltabelle um eine OFFICE-Spalte erweitert haben (die angibt, welches Büro in dem Gebäude sie haben), möchten wir dies möglicherweise zu einem UNIQUE-Index machen. Lassen Sie uns mit dieser Tabelle arbeiten:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  OFFICE INT,
  PRIMARY KEY (ID)
);

Beachten Sie, dass wir jetzt eine Ganzzahl in der Tabelle gespeichert haben, um anzugeben, welches Amt die Person einnimmt. Dies kann sich auf eine andere Tabelle „BÜROS“ beziehen, die Informationen über verschiedene Büros im Gebäude enthält.

Um einen Index darauf zu erstellen, würden wir den folgenden Befehl ausgeben:

CREATE UNIQUE INDEX idx3 ON EMPLOYEE (OFFICE);

Sie können ähnliche Befehle verwenden, um diese in den Befehlen CREATE TABLE und ALTER TABLE zu erstellen. Wenn Sie nun versucht haben, diese beiden Einfügungen auszuführen:

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (1, 'JANE', 'JOHNSON', 1);

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (2, 'JOHN', 'SMITH', 1);

Sie würden beim zweiten INSERT:

einen Fehler erhalten
Duplicate entry '1' for key 'idx3'

Einen Index entfernen

Es kann vorkommen, dass Sie keinen Index mehr für eine Spalte benötigen. Vielleicht ist Ihnen aufgefallen, dass Sie eine Spalte nicht allzu oft durchsuchen und dass der Index Einfügungen und Aktualisierungen verlangsamt. Dazu verwenden wir den Befehl DROP INDEX. Unsere Tabelle wurde wie folgt erstellt:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR,
  LASTNAME CHAR,
  PRIMARY KEY (ID),
  INDEX idx (LASTNAME,FIRSTNAME)
);

Wenn wir den Index für die Spalten LASTNAME und FIRSTNAME entfernen möchten, geben wir diesen Befehl aus:

DROP INDEX IDX ON EMPLOYEE;

Schlussfolgerung

Datenbankindizes sind ein grundlegendes Werkzeug, das die Geschwindigkeit des Datenabrufs innerhalb einer Struktur optimiert, die die Such- und Leseleistung in einer Tabelle nutzt. Die Indexerweiterung wird hauptsächlich auf Kosten von mehr Schreibvorgängen und/oder Speicherplatz betrieben, um eine optimale Indexdatenstruktur aufrechtzuerhalten.

MySQL- und MariaDB-Datenbanken bieten mehrere andere Such- und Leseoptionen, darunter viele, die hier nicht behandelt wurden. Zu den wichtigsten Erkenntnissen hier gehören: 

  • Stellen Sie sicher, dass Sie sich die Zeit nehmen, Ihre Tische im Voraus zu planen.
  • Wenn Sie beim Erstellen der Tabellen nicht vorausplanen, werten Sie die Spalten aus, die am häufigsten durchsucht werden, und erstellen Sie einen Index für sie.

Sehen Sie es in Aktion!

Unsere breite Palette an dedizierten Servern bietet die Leistung, Stabilität und Sicherheit, die zum Hosten der kleinsten Datenbank für wachsende Unternehmen bis hin zu hochverfügbaren, geclusterten Servern für die größten Unternehmen erforderlich sind. Möchten Sie sehen, welche Lösungen wir für Ihre Anforderungen anbieten können?

Rufen Sie uns unter 800.580.4985 an oder öffnen Sie einen Chat oder ein Ticket mit uns, um mit einem unserer sachkundigen Lösungs- oder erfahrenen Hosting-Berater zu sprechen und zu erfahren, wie Sie diese Technologie noch heute nutzen können!

Seriennavigation<>