Vinzenz: Wie bekomme ich einen JOIN schnell?

Beitrag lesen

Hallo Andreas

Tabelle "a" enthält wenige Datensätze, und die wenigen Datensätze sollen noch mit in Tabelle "b"(viel mehr Datensätze) enthaltenen Daten gefiltert werden.

SELECT a.key
FROM a
LEFT JOIN b
ON a.key=b.key
WHERE(b.wert1 = 1234 AND b.wert2 < 4321)

So. Zunächst, die Richtung des Joins sollte ja so stimmen. Aber wie optimiere ich das jetzt? In der MySQL Doku steht im Kapitel zur Optimierung, dass man unbedingt einen Index über beide Tabellen anlegen soll, aber wie geht das? Das steht nirgends in der Doku! Und auch in PHPmyADmin finde ich keine Möglichkeit. Wie muß das heißen? Und wie sollte der Index idealerweise überhaupt aussehen, also über welche Spalten und in welcher Reihenfolge?

Du hast es ja selbst gelesen: Den Index musst Du in den Tabellen anlegen. Geht sogar mit phpMyAdmin ...

ich habe ja
a.key <= benötigt für den JOIN
b.key <= benötigt für den JOIN

Also jeweils ein Index für das Feld key in Tabelle a und in Tabelle b

b.wert1 <= benötigt für WHERE cond.
b.wert2 <= benötigt für WHERE cond.

Greifst Du oft auf diese Spalten zu, dann lohnt sich auch ein Index dafür

Soweit ich das weiß sollten die Spalten in der Reihenfolge ihres "unique-Grades" im Index stehen.

a.key ist eine Teilmenge aus b.key, welches unique ist.

Wenn ich Dich richtig verstehe, hast Du ja schon einen UNIQUE-Index auf key in Tabelle b.

Was für einen Index Du in Tabelle a verwendest, hängt von der Beziehung zwischen den Tabellen ab.

Können einem Datensatz aus Tabelle b mehrere Datensätze aus Tabelle a zugeordnet sein (1:n)-Beziehung, dann ein einfacher Index auf key in Tabelle a

Ist jedem Datensatz aus Tabelle b maximal ein Datensatz aus Tabelle a zugeordnet (1:1)-Beziehung, dann ein UNIQUE-Index auf key in Tabelle a

Was für Indizes auf die Spalten b.wert1 und b.wert2, hängt von den möglichen Werten ab, wahrscheinlich also ein einfacher Index, da die Werte wohl mehrfach vorkommen können.

Denke daran, dass Indizes die Einfüge- und Löschoperationen auf den Tabellen verlangsamen.

aber was ist mit den beiden anderen Spalten für die WHERE Bedingung? sollte ich die auch hinzufügen, oder lieber nicht? Was ist im allgemeinen wichtiger, ein Index über die JOIN-Spalten, oder über die WHERE-Bedingungen-Spalten?

Ein Index über die JOIN-Spalten sollte _immer_ vorhanden sein, sonst darf das DBMS linear suchen *wart*

Gruss,

Vinzenz