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) = ...
select
aufgrund der Indexzusammenführung mehr als ein Index pro verwendet werden. percona.com/blog/2012/12/14/…Ich bin mit einigen Antworten auf diese Frage nicht einverstanden.
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.
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.
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.
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.
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 .
quelle
Indizes sollten über das jeweilige Problem informiert werden: die Tabellen, die Abfragen, die Ihre Anwendung ausführen wird usw.
SELECTs.
INSERTs sind langsamer, da Sie den Index aktualisieren müssen.
Wenn Ihre Anwendung eine andere WHERE-Klausel benötigt.
Wenn Sie es nicht benötigen, um Eindeutigkeitsbeschränkungen abzufragen oder durchzusetzen.
Ich verstehe die Frage nicht. Wenn Sie eine Eindeutigkeitsbeschränkung haben, die mehrere Spalten enthält, modellieren Sie sie auf jeden Fall als solche.
quelle
Ja. Suchen Sie nicht nach Indizes, sondern nach Bedarf.
Alle Abfragen für die Indextabelle / -ansicht.
Alle INSERT-Anweisungen für die indizierte Tabelle werden verlangsamt, da jeder neue Datensatz indiziert werden muss.
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).
Wenn Sie es aus Gründen tun - dh Überoptimierung.
Hängt von den Abfragen ab, die Sie verbessern möchten.
quelle
Ja, wie alle Dinge verlangsamen zu viele Indizes die Datenmanipulation.
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.
quelle