Teil 1: MySQL4 - Optimierung von Anfragen

SQL-Optimierung: Indizes richtig einsetzen

Verwenden Sie eindeutige Indizes

Betrachten Sie die Verteilung von Werten innerhalb einer Spalte. Indizes funktionieren am besten für Spalten mit eindeutigen Werten und am schlechtesten für Spalten mit vielen mehrfach auftretenden Werten. Enthält eine Spalte beispielsweise Altersangaben und treten sehr viele verschiedene Werte auf, dann kann ein Index die Zeilen sinnvoll differenzieren.

Ein Index ist nicht sinnvoll, wenn eine Spalte das Geschlecht aufzeichnet und nur die beiden Werte M und W aufnehmen kann (egal nach welchem Wert Sie suchen, Sie werden immer noch etwa die Hälfte der Zeilen erhalten). Unter diesen Umständen wird der Index niemals benutzt werden, da die Anfrageoptimierung in der Regel das vollständige Durchsuchen der Tabelle vorzieht, wenn sie feststellt, dass ein Wert in mehr als etwa 30 Prozent der Tabellenzeilen auftaucht.

Indizieren Sie kurze Werte

Falls Sie eine Stringspalte indizieren, geben Sie eine Präfixlänge an, bei der das in Betracht kommt. Angenommen, Sie haben eine CHAR(200)-Spalte, dann sollten Sie keinen Index über die ganze Spalte legen, wenn sich die meisten Werte innerhalb der ersten zehn oder zwanzig Bytes unterscheiden. Durch die Indizierung der ersten zehn oder zwanzig Bytes sparen Sie im Index viel Platz und machen wahrscheinlich auch Ihre Anfragen schneller. Ein kleinerer Index verursacht weniger Festplattenaktivität, und kürzere Werte können schneller verglichen werden.

Außerdem können, was noch wichtiger ist, bei der Verwendung kürzerer Schüsselwerte die Blöcke im Indexcache mehr Schlüsselwerte aufnehmen, sodass MySQL mehr Schlüssel gleichzeitig im Speicher vorhalten kann. Damit ist es wahrscheinlicher, Zeilen zu finden, ohne zusätzliche Blöcke aus dem Index lesen zu müssen. (Hier sollten Sie natürlich auch Ihren gesunden Menschenverstand einsetzen. Durch die Indizierung des ersten Zeichens einer Spalte werden Sie nicht viel gewinnen, weil es dann nicht sehr viele unterschiedliche Werte im Index gibt.)