Es ist wichtig zu beachten, dass die Reihenfolge der Felder im Index von Bedeutung ist.
Ein Index ist in gewissem Sinne ein Suchbaum. Wenn Sie indizieren (B.event, B.state), gruppiert der Baum alle Datensätze mit dem Feld "Ereignis" speichern und sortiert sie dann nach dem Feld "Status".
Wenn Sie dann diesen Index für "b.state = x" abfragen würden, wäre der Index von geringem Nutzen; Der Index wird zuerst nach dem "Ereignis" geordnet.
In Ihrem Beispiel:
- Filter A von seinem "Event" Feld
- beitreten A.event B.event
- beitreten B.state zu C.id
- Join B.hur = D.id
- Sortieren nach B.event, B.timestamp
Es ist wichtig zu beachten, dass die Optimierung auf die Statistik Ihrer Tabellen aussehen wird, und Indizes, kann dann neu ordnen, um die Reihenfolge der die Verknüpfungen. Das Ergebnis ist das gleiche, aber die Reihenfolge kann zu einer anderen Leistung führen, und der Job des Optimierers besteht darin, die beste Leistung zu finden.
In Ihrem Fall würde ich erwarten, dass die Reihenfolge von B.event extrem wichtig ist. Einfach weil das die Reihenfolge der resultierenden Ausgabe ist, UND es ist das Feld, nach dem Sie filtern.
Als nächstes schließen Sie B.state an C.id. Also, wenn C.id gut ist und indexiert, macht es den Join schneller. Aber auch die B-Tabellendaten in einer netten Reihenfolge können den Join schneller machen.
Aber ein Index für B.event und einen separaten Index für B.state kann wenig ergeben. Der B.State-Index wird nahezu sinnlos, da wir den B.event-Index verwenden. Wenn Sie die beiden zu einem Index kombinieren (b.event, dann b.state), kann der Ausführungsplan einen Weg finden, den b.state-Teil des Index zu verwenden.
Schließlich, wenn Sie alle Felder in den Index setzen, wird der Index größer, aber die Abfrage möglicherweise nie wirklich auf die Tabelle zu suchen. Die Information befindet sich im Index. Die Zeit, die benötigt wird, um von einem Index zur Tabelle zu gelangen, um die fehlenden Felder zu finden, ist ähnlich wie bei einem Join. Für die Leseleistung kann das Hinzufügen zusätzlicher Felder zu dem Index von wesentlicher Bedeutung sein.
Ich Wittenau auf jetzt, aber die Zusammenfassung ist dies:
- In der Regel separaten Index auf getrennten Feldern bekomme zusammen
nicht verwendet - Bei zusammengesetzten Indizes Sie die Reihenfolge der Felder festlegen, macht einen Unterschied
- Hinzufügen 'extra' Felder zum Index macht es größer, kann aber auch Anfragen schneller
- Die Reihenfolge des Ausführungsplans zählt mehr als die Reihenfolge Ihrer Abfrage
- Aber die Indizes, die Sie haben, kann die Reihenfolge bestimmen der Ausführungsplan
Diese Art von Arbeit hat keine kategorischen Antworten. Es ist so abhängig von Ihren Daten, dass es näher an einer Kunst ist.
Eine Option besteht darin, die Tabellen mit Indizes zu überladen, den resultierenden Ausführungsplan zu betrachten und die nicht benötigten Indizes zu löschen.
Aber selbst dort gilt ein Vorbehalt. Da der Ausführungsplan von Daten (und Tabellenstatistiken) abhängig ist, ist es sehr wichtig, reale Daten in den Tabellen zu haben. Während die Tabellen 10 oder 100 Zeilen haben, kann ein Ausführungsplan am schnellsten sein. Aber wenn Sie Millionen von Zeilen erhalten, kann sich der Ausführungsplan ändern und von verschiedenen Indizes profitieren.
Korrekt, aber prüfen Sie, ob B.timestamp tatsächlich verwendet wird. – Pomyk
Wie groß sind die einzelnen Tabellen und wie viele Zeilen würden Sie bei einer bestimmten Abfrage erwarten? Welche Datenbank verwendest du? –
Wie häufig werden Daten in die Tabellen eingefügt und wie häufig möchten Sie die Abfrage ausführen? –