Indizes können eine wichtige Rolle bei der Abfrageoptimierung und der schnellen Suche nach Ergebnissen aus Tabellen spielen. Daher ist es der wichtigste Schritt, auszuwählen, welche Spalten indiziert werden sollen. Es gibt zwei Hauptstellen, an denen wir eine Indizierung in Betracht ziehen können: Spalten, auf die in der WHERE-Klausel verwiesen wird, und Spalten, die in JOIN-Klauseln verwendet werden. Kurz gesagt, solche Spalten sollten indiziert sein, anhand derer Sie bestimmte Datensätze durchsuchen müssen. Angenommen, wir haben eine Tabelle mit dem Namen Käufer, in der die SELECT-Abfrage Indizes wie die folgenden verwendet:
SELECT
buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal' /* consider to use index */
Da im Abschnitt SELECT auf "purchase_id" verwiesen wird, wird MySQL es nicht verwenden, um die ausgewählten Zeilen einzuschränken. Daher besteht keine große Notwendigkeit, es zu indizieren. Das Folgende ist ein weiteres Beispiel, das sich kaum von dem obigen unterscheidet:
SELECT
buyers.buyer_id, /* no need to index */
country.name /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
first_name='Tariq' /* consider to use index */
AND
last_name='Iqbal' /* consider to use index */
Gemäß den obigen Abfragen first_name können last_name-Spalten indiziert werden, da sie sich in der WHERE-Klausel befinden. Ein zusätzliches Feld, country_id aus der Ländertabelle, kann für die Indizierung berücksichtigt werden, da es sich in einer JOIN-Klausel befindet. Daher kann die Indizierung für jedes Feld in der WHERE-Klausel oder einer JOIN-Klausel berücksichtigt werden.
Die folgende Liste enthält auch einige Tipps, die Sie immer beachten sollten, wenn Sie Indizes in Ihre Tabellen erstellen möchten:
- Indizieren Sie nur die Spalten, die in den Klauseln WHERE und ORDER BY erforderlich sind. Indizierung von Spalten im Überfluss führt zu einigen Nachteilen.
- Versuchen Sie, die Funktionen "Indexpräfix" oder "Mehrspaltenindex" von MySQL zu nutzen. Wenn Sie einen Index wie INDEX (Vorname, Nachname) erstellen, erstellen Sie keinen INDEX (Vorname). "Indexpräfix" oder "mehrspaltiger Index" wird jedoch nicht in allen Suchfällen empfohlen.
- Verwenden Sie das NOT NULL-Attribut für die Spalten, in denen Sie die Indizierung berücksichtigen, damit NULL-Werte niemals gespeichert werden.
- Verwenden Sie die Option --log-long-format, um Abfragen zu protokollieren, die keine Indizes verwenden. Auf diese Weise können Sie diese Protokolldatei untersuchen und Ihre Abfragen entsprechend anpassen.
- Mit der EXPLAIN-Anweisung können Sie feststellen, wie MySQL eine Abfrage ausführt. Es zeigt, wie und in welcher Reihenfolge Tabellen zusammengefügt werden. Dies kann sehr nützlich sein, um zu bestimmen, wie optimierte Abfragen geschrieben werden und ob die Spalten indiziert werden müssen.
Update (23. Februar 15):
Jeder Index (gut / schlecht) erhöht die Einfüge- und Aktualisierungszeit.
Abhängig von Ihren Indizes (Anzahl der Indizes und Typ) wird das Ergebnis gesucht. Wenn sich Ihre Suchzeit aufgrund des Index erhöht, ist das ein schlechter Index.
Wahrscheinlich in jedem Buch könnte "Indexseite" eine Kapitelstartseite haben, die Themenseitennummer beginnt, auch die Unterthemenseite beginnt. Einige Erläuterungen auf der Indexseite helfen, aber ein detaillierterer Index kann Sie verwirren oder erschrecken. Indizes haben auch Speicher.
Die Indexauswahl sollte sinnvoll sein. Beachten Sie, dass nicht für alle Spalten ein Index erforderlich ist.