Ein Index in einer Datenbank ist vergleichbar mit dem Inhaltsverzeichnis eines Buches. Statt alle Seiten durchblättern zu müssen, können Sie anhand des Inhaltsverzeichnisses schnell die gesuchte Seite finden. Genauso funktionieren Indizes in Datenbanken - sie beschleunigen das Auffinden von Datensätzen.
Ein Index ist eine zusätzliche Datenstruktur, die Verweise auf die eigentlichen Datensätze enthält. MySQL verwendet B-Tree Indizes, die sehr effizient für Bereichsabfragen und Sortierungen sind.
MySQL legt in folgenden Fällen automatisch einen Index an:
CREATE TABLE kunden (
id INT PRIMARY KEY, -- Erzeugt automatisch einen Index
name VARCHAR(100)
);CREATE TABLE mitarbeiter (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE -- Erzeugt automatisch einen Index
);CREATE TABLE bestellungen (
id INT PRIMARY KEY,
kunden_id INT,
FOREIGN KEY (kunden_id) REFERENCES kunden(id) -- Erzeugt automatisch einen Index
);Es gibt verschiedene Möglichkeiten, einen Index zu erstellen:
CREATE TABLE produkte (
id INT PRIMARY KEY,
name VARCHAR(100),
kategorie VARCHAR(50),
preis DECIMAL(10,2),
INDEX idx_kategorie (kategorie),
INDEX idx_preis (preis)
);CREATE INDEX idx_name ON produkte(name);ALTER TABLE produkte ADD INDEX idx_name_preis (name, preis);Um sicherzustellen, dass bestimmte Werte eindeutig sind:
CREATE UNIQUE INDEX idx_email ON mitarbeiter(email);ALTER TABLE mitarbeiter ADD UNIQUE (email);CREATE TABLE benutzer (
id INT PRIMARY KEY,
username VARCHAR(50) UNIQUE,
email VARCHAR(100) UNIQUE
);CREATE TABLE buchungen (
id INT PRIMARY KEY,
raum_nr INT,
datum DATE,
UNIQUE INDEX idx_buchung (raum_nr, datum)
);Die Indexselektivität gibt an, wie viele unterschiedliche Werte im Verhältnis zur Gesamtanzahl der Datensätze existieren:
Beispiel für die Berechnung der Selektivität:
SELECT COUNT(DISTINCT spalte) / COUNT(*) AS selektivitaet
FROM tabelle;Es gibt zwei Möglichkeiten:
DROP INDEX idx_name ON produkte;ALTER TABLE produkte DROP INDEX idx_name;WICHTIG: Der Index eines Primärschlüssels kann nicht direkt gelöscht werden. Sie müssen zuerst den Primärschlüssel entfernen:
ALTER TABLE produkte DROP PRIMARY KEY;Tipps für die Verwendung von Indizes:
Analysieren Sie das Abfrageverhalten:
Beachten Sie die Performance-Auswirkungen:
Vermeiden Sie überflüssige Indizes:
Überprüfen Sie die Indexnutzung:
EXPLAIN SELECT * FROM produkte WHERE kategorie = 'Elektronik';-- Besser:
CREATE INDEX idx_stadt_plz ON adressen(stadt, plz);
-- Statt:
CREATE INDEX idx_stadt ON adressen(stadt);
CREATE INDEX idx_plz ON adressen(plz);