Ich bin mit einigen Antworten auf diese Frage nicht einverstanden.
Gibt es zu viele Indizes?
Natürlich. Erstellen Sie keine Indizes, die von keiner Ihrer Abfragen verwendet werden. Erstellen Sie keine redundanten Indizes. Verwenden Sie Tools wie pt-duplicate-key-checker und pt-index-usage , um die nicht benötigten Indizes zu ermitteln.
Was beschleunigen Indizes?
- Suchbedingungen in der WHERE-Klausel.
- Beitrittsbedingungen.
- Einige Fälle von ORDER BY.
- Einige Fälle von GROUP BY.
- EINZIGARTIGE Einschränkungen.
- FOREIGN KEY-Einschränkungen.
- Volltextsuche.
Andere Antworten haben darauf hingewiesen, dass INSERT / UPDATE / DELETE langsamer sind, je mehr Indizes Sie haben. Das stimmt, aber bedenken Sie, dass viele Verwendungen von UPDATE und DELETE auch WHERE-Klauseln haben und in MySQL auch UPDATE und DELETE JOINs unterstützen. Indizes können diesen Abfragen mehr zugute kommen, als den Aufwand für die Aktualisierung von Indizes auszugleichen.
InnoDB sperrt außerdem Zeilen, die von UPDATE oder DELETE betroffen sind. Sie nennen dies Sperren auf Zeilenebene, aber es ist wirklich Sperren auf Indexebene. Wenn es keinen Index gibt, um die Suche einzugrenzen, muss InnoDB viel mehr Zeilen sperren als die bestimmte Zeile, die Sie ändern. Es kann sogar alle Zeilen in der Tabelle sperren . Diese Sperren blockieren Änderungen, die von anderen Clients vorgenommen wurden, auch wenn sie nicht logisch in Konflikt stehen.
Wann ist es eine gute Idee, einen Index hinzuzufügen?
Wenn Sie wissen, dass Sie eine Abfrage ausführen müssen, die in einem der oben genannten Fälle von einem Index profitieren würde.
Wann ist es eine schlechte Idee, einen Index hinzuzufügen?
Wenn der Index ein linkes Präfix eines anderen vorhandenen Index ist oder der Index keiner der Abfragen hilft, die Sie ausführen müssen.
Vor- und Nachteile mehrerer Indizes gegenüber mehrspaltigen Indizes?
In einigen Fällen kann MySQL eine Optimierung der Indexzusammenführung durchführen und die Ergebnisse unabhängiger Indexsuchen entweder vereinen oder überschneiden. Das Definieren eines einzelnen Index bietet jedoch eine bessere Leistung, sodass die Indexzusammenführung nicht durchgeführt werden muss.
Für einen meiner Beratungskunden habe ich einen mehrspaltigen Index für eine Viele-zu-Viele-Tabelle definiert, in der es keinen Index gab, und die Join-Abfrage um den Faktor 94 Millionen verbessert!
Das Entwerfen der richtigen Indizes ist ein komplexer Prozess, der auf den Abfragen basiert, die Sie optimieren müssen . Sie sollten keine allgemeinen Regeln wie "Alles indizieren" oder "Nichts indizieren, um Aktualisierungen nicht zu verlangsamen" festlegen.
Siehe auch meine Präsentation Wie man Indizes wirklich entwirft .