Mysql
 sql >> Datenbank >  >> RDS >> Mysql

DOs und DONTs für Indizes

Allgemein gesagt:

1. Fügen Sie keinen Index hinzu, wenn Sie ihn nicht wirklich brauchen.

Jeder Index macht Schreibvorgänge langsamer...

2. Für where-Klauseln wird ein Index verwendet:

-- index on foo (bar)
select bar from foo where bar = :bar;

Aus dem gleichen Grund wird es in Fremdschlüsselreferenzen (in beiden Tabellen) verwendet.

-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar)); 

3. Ein Index wird zum Sortieren verwendet, insbesondere wenn er an ein Limit gebunden ist:

-- index on foo (bar)
select bar from foo order by bar limit 10;

4. Mehrspaltige Indizes sind gelegentlich sinnvoll, wenn 2. und 3. beide zutreffen.

Setzen Sie in diesem Fall die Where-Bedingungen zuerst und den Sortierschlüssel zuletzt:

-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;

5. Halten Sie Ihre Tabellenstatistiken auf dem neuesten Stand.

Wenn die Tabellenstatistiken Müll sind, besteht eine geringe Chance, dass der Optimierer Ihre Indizes verwendet. Vakuumieren/analysieren Sie Ihre Datenbank bei Bedarf manuell.

6. Die Indexverwendung hängt von Ihrer Tabellenaufteilung ab.

Über einen bestimmten Schwellenwert von abgerufenen Zeilen hinaus ist es schneller, einen vollständigen Tabellenscan durchzuführen. Wenn sich Ihr Index auf einem booleschen Feld befindet, das Ihre Tabelle mehr oder weniger in zwei Teile teilt, wird er niemals verwendet.

Wenn Ihre Daten so gespeichert sind, dass der Index-Scan wahrscheinlich zufällig auf fast alle anwendbaren Festplattenseiten für diese Tabelle zugreift, wird der Planer einen vollständigen Tabellen-Scan bevorzugen.

7. Berücksichtigen Sie Teil-/Ausdrucksindizes, sofern verfügbar.

Wenn Sie ein Feld haben, das bis auf 10 % Ihrer Zeilen denselben Wert hat, sollten Sie einen Teilindex darauf verwenden (d. h. wo nicht dieser Wert). Dies führt zu einem viel kleineren Index, ohne seine eigentliche Nützlichkeit zu beeinträchtigen.

Wenn Sie ständig einen Ausdruck abfragen, der auf Ihre Spalte angewendet wird, und Ihre Plattform Ausdrucksindizes anbietet, sollten Sie erwägen, einen Index darauf hinzuzufügen. Bei Verwendung wird der Ausdruck nicht für jede Zeile ausgewertet.