Vinzenz: Wie bekomme ich einen JOIN schnell?

Beitrag lesen

Hallo Andreas,

Ich finde es nicht mehr, aber ich könnte schwören das ich in der Doku irgendwo gelesen habe dass man auch indices über 2 Tabellen erstellen kann. Wobei - mysql erstellt pro Tabelle ein Verzeichis, wo sollte dann der Index gespeichert werden?

Wär' mir, ehrlich gesagt, neu - aber interessant. Ich frag' mich aber, was das nutzen soll? Seh' ich im Moment einfach nicht.

Eine gute Lektüre über MySQL und Indizes:
http://www.mysql.com/doc/en/MySQL_indexes.html

»

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
Aber es kann doch pro Abfrage nur _ein_ Index verwendet werden, oder?

Nein, MySQL nutzt soviele wie es für nötig hält.

1. Index auf a.key und b.key

Wird der Index auf b.key und a.key genutzt, um schnell die relevanten Zeilen zu finden, vermeidet eben die lineare Suche

2. Index auf b.wert1 und b.wert2

Wie Du dort nachlesen kannst, verwendet MySQL einen ggf. vorhandenen Index, wenn MySQL dadurch weniger als 30% der Datensätze lesen muss.

Jedesmal greife ich drauf zu. Ich will einen Index gerade für die obige Anfrage optimieren.

Wenn Du eine spezielle Abfrage optimieren willst, dann verwende EXPLAIN, um herauszufinden, wie MySQL an die Abfrage rangeht, anschließend kannst Du in der SELECT-Anweisung noch USE INDEX verwenden, um MySQL einen bestimmten Index anzuweisen, den es nutzen soll.

nö, die Spalte "key" ist nur unique. Was bringt mir ein Primärschlüssel, wenn ich gerne einen Index mit allen 4 Spalten hätte,  oder brauche ich einen primär-Schlüssel über die Spalte a.key, und einen 2. Index über (b.key,b.wert1,b.wert2)? b.key ist ebenfalls unique, und somit sollte es auch an erster Stelle stehen.

Indizes gehören zum allgemeinen Datenbankentwurf, und nicht unbedingt zur Optimierung einer Abfrage. Ist es allerdings _die_ Abfrage, die 90% Deiner Datenbankaktionen ausmacht, dann lohnt es sich, die Datenbank in Hinblick auf diese Abfrage zu optimieren.

MySQL verwendet drei Schlüsselwörter, um Indizes anzulegen:

PRIMARY KEY - Primärschlüssel, ist auf jeden Fall eindeutig
UNIQUE - ein eindeutiger Index, d.h. jeder Wert darf nur einmal vorkommen
INDEX - Ein nicht eindeutiger Index

Alle drei Anweisungen erzeugen einen Index, und ein eindeutiger Index muss nicht unbedingt ein Primärschlüssel sein (wenn er es auch meistens ist)

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
Oh, jetzt wo Du es sagst, sicher kann das sein ;-)

Also a.key ist also doch nicht unique, kann aber immer noch nur Wete aus b.key enthalten, welche aber auf alle Fälle unique ist.

Wenn Du eine 1:n-Beziehung zwischen zwei Tabellen hast, und Du oft den JOIN nutzt, dann indiziere die Felder.

Wär' zu schön, wenn MySQL schon FOREIGN KEY in 3.x.x hätte.

beste, da bringt es nichts wenn ich 4 für sich nette Indices habe, ich brauche _einen_ guten der auf obige Abfrage passt.

Doch

Das ist egal.

Dann nimm so viele Indizes wie möglich!

Gruss,

Vinzenz