MySQL zu viele Indizes?

81

Ich verbringe einige Zeit damit, unsere aktuelle Datenbank zu optimieren.

Ich betrachte speziell Indizes.

Es gibt einige Fragen:

  • Gibt es zu viele Indizes?
  • Was beschleunigen Indizes?
  • Was verlangsamt sich die Indizes?
  • Wann ist es eine gute Idee, einen Index hinzuzufügen?
  • Wann ist es eine schlechte Idee, einen Index hinzuzufügen?
  • Vor- und Nachteile mehrerer Indizes gegenüber mehrspaltigen Indizes?
Hagelholz
quelle

Antworten:

147

Was beschleunigen Indizes?

Datenabruf - SELECT-Anweisungen.

Was verlangsamt sich die Indizes?

Datenmanipulation - Anweisungen INSERT, UPDATE, DELETE.

Wann ist es eine gute Idee, einen Index hinzuzufügen?

Wenn Sie das Gefühl haben, eine bessere Leistung beim Abrufen von Daten zu erzielen.

Wann ist es eine schlechte Idee, einen Index hinzuzufügen?

Auf Tabellen, bei denen starke Datenmanipulationen auftreten - Einfügen, Aktualisieren ...

Vor- und Nachteile mehrerer Indizes gegenüber mehrspaltigen Indizes?

Abfragen müssen die Reihenfolge der Spalten beim Umgang mit einem abdeckenden Index (einem Index für mehr als eine Spalte) von links nach rechts in der Indexspaltendefinition berücksichtigen. Die Spaltenreihenfolge in der Anweisung spielt keine Rolle, nur die der Spalten 1, 2 und 3 - eine Anweisung muss einen Verweis auf Spalte 1 haben, bevor der Index verwendet werden kann. Wenn nur auf Spalte 2 oder 3 verwiesen wird, kann der Deckungsindex für 1/2/3 nicht verwendet werden.

In MySQL kann nur ein Index pro SELECT / Anweisung in der Abfrage verwendet werden (Unterabfragen / etc werden als separate Anweisung angesehen). Der Speicherplatz pro Tabelle, den MySQL zulässt, ist begrenzt. Wenn Sie eine Funktion für eine indizierte Spalte ausführen, wird der Index außerdem unbrauchbar - IE:

WHERE DATE(datetime_column) = ...
OMG Ponys
quelle
10
Wow, diese Informationen sind wirklich erstaunlich gut strukturiert und sehr hilfreich! Und das Hilfreichste für mich war, dass ein Index, auf den eine Funktion angewendet wird, nutzlos ist ... danke für diese Antwort!
Chris
2
@OMG, In Bezug auf Ihren letzten Absatz kann selectaufgrund der Indexzusammenführung mehr als ein Index pro verwendet werden. percona.com/blog/2012/12/14/…
Pacerier
1
-1 für die Aussage (1) beschleunigt nur "SELECT", es beschleunigt SELECT-, UPDATE- und DELETE-Abfragen, vorausgesetzt, die Indizes werden gemäß den "WHERE" -Bedingungen korrekt erstellt, erfordern jedoch eine Aktualisierung der Indizes bei der Datenmanipulation, was bedeutet dass nur INSERT-Abfragen (in allen Fällen) langsamer sind als ohne Indizes und (2) um zu sagen, dass MySQL jeweils nur einen Index verwenden kann.
Patrick Allaert
Wie @PatrickAllaert -1 für irreführende Informationen über Update, löschen
Eimsas
64

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 .

Bill Karwin
quelle
10
+1 für "... 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 nützen, als den Aufwand für die Aktualisierung von Indizes auszugleichen."
Rob Craig
1
Dies sollte die akzeptierte Antwort sein, wenn Klauseln beim Aktualisieren und Löschen berücksichtigt wurden.
Leonardo Emilio Dominguez
1
Dies ist die richtige Antwort, die als richtig markiert ist, ist falsch.
Eimsas
7

Gibt es zu viele Indizes?

Indizes sollten über das jeweilige Problem informiert werden: die Tabellen, die Abfragen, die Ihre Anwendung ausführen wird usw.

Was beschleunigen Indizes?

SELECTs.

Was verlangsamt sich die Indizes?

INSERTs sind langsamer, da Sie den Index aktualisieren müssen.

Wann ist es eine gute Idee, einen Index hinzuzufügen?

Wenn Ihre Anwendung eine andere WHERE-Klausel benötigt.

Wann ist es eine schlechte Idee, einen Index hinzuzufügen?

Wenn Sie es nicht benötigen, um Eindeutigkeitsbeschränkungen abzufragen oder durchzusetzen.

Vor- und Nachteile mehrerer Indizes gegenüber mehrspaltigen Indizes?

Ich verstehe die Frage nicht. Wenn Sie eine Eindeutigkeitsbeschränkung haben, die mehrere Spalten enthält, modellieren Sie sie auf jeden Fall als solche.

Duffymo
quelle
4

Gibt es zu viele Indizes?

Ja. Suchen Sie nicht nach Indizes, sondern nach Bedarf.

Was beschleunigen Indizes?

Alle Abfragen für die Indextabelle / -ansicht.

Was verlangsamt sich die Indizes?

Alle INSERT-Anweisungen für die indizierte Tabelle werden verlangsamt, da jeder neue Datensatz indiziert werden muss.

Wann ist es eine gute Idee, einen Index hinzuzufügen?

Wenn eine Abfrage nicht mit einer akzeptablen Geschwindigkeit ausgeführt wird. Möglicherweise filtern Sie nach Datensätzen, die nicht Teil der Cluster-PK sind. In diesem Fall sollten Sie Indizes hinzufügen, die auf den Filtern basieren, nach denen Sie suchen (sofern die Leistung dies für richtig hält).

Wann ist es eine schlechte Idee, einen Index hinzuzufügen?

Wenn Sie es aus Gründen tun - dh Überoptimierung.

Vor- und Nachteile mehrerer Indizes gegenüber mehrspaltigen Indizes?

Hängt von den Abfragen ab, die Sie verbessern möchten.

RPM1984
quelle
3

Gibt es zu viele Indizes?

Ja, wie alle Dinge verlangsamen zu viele Indizes die Datenmanipulation.

Wann ist es eine gute Idee, einen Index hinzuzufügen?

Eine gute Idee, einen Index hinzuzufügen, ist, wenn Ihre Abfragen zu langsam sind (dh Sie haben zu viele Verknüpfungen in Ihren Abfragen). Sie sollten diese Optimierung erst verwenden, nachdem Sie ein solides Modell erstellt haben, um die Leistung zu optimieren.

Daniel Fath
quelle