phpbar.de logo

Mailinglisten-Archive

index ueber mehrere tables

index ueber mehrere tables

Michael Donning donning at informenta.de
Die Mar 18 20:44:50 CET 2003


Hallo Carsten

> -----Original Message-----
> From: Carsten Wawer [mailto:mailingliste at wawer.de]
> hallo stefan,
>
> > So:
> >
> > KEY ( spalte_a, spalte_b )
> >
> > Die Spalten sollten aber IMHO gleiches Format haben.
> > Schau am besten noch mal in die Doku.
@Stefan: Das ist kein Index über mehrere Tabellen und den gibts "so" auch
nicht.

>
> ich wollte über mehrere tables suchen. beispiel:
>
> table1: personen
> ================
> * id
> * name
> * vorname
> * beruf
>
> table2: staedte
> ===============
> * id
> * name
>
> table3: wohnorte
> ================
> * id
> * fk_stadt
> * fk_person
>
> jetzt habe ich einen index auf personen.beruf und möchte alle
> arbeitslosen personen aus köln dargestellt bekommen. koeln hat id 12.
>
> SELECT personen.vorname, personen.nachname
> FROM personen
> INNER JOIN wohnorte ON wohnorte.fk_person = personen.id
> WHERE personen.beruf = 'arbeitslos' AND wohnorte.fk_stadt = 12
>
> der index auf personen.beruf wird aber laut EXPLAIN nicht genutzt. woran
> liegts?

Tja der Optimizer hat da immer seine eigenen Vorstellungen :), u.a. auch
über die join Reihenfolge.

Zunächst sollte bei einem Join auch ein Index über (am besten) die komplette
Join-Bedingung stattfinden:

-> Index auf wohnorte.fk_person
bzw in diesem Fall auf die komplette Bedingung:
-> Index auf wohnorte (fk_stadt,fk_person) (Reihenfolge der Spalten hier
nicht so wichtig, hat aber später Einfluß auf die Wiederverwendbarkeit des
Indizes, so wie hier kann er auch als Index auf fk_stadt alleine verwendet
werden).

Den Index auf personen.beruf solltest Du natürlich beibehalten.

Ansonsten richtet sich mysql noch nach der Werteverteilung in den Tabellen,
enthalten die Tabellen zur Zeit noch Testdaten bzw. unrepräsentative Werte,
so geht mysql teilw. einen anderen als den gedachten Weg. (z.b. wenn die
Tabelle den Zustand vom Rosenmontag enthält, wo keiner in Köln arbeitet,
wenn alle arbeitslos sind, dann braucht man dafür auch keinen Index)

Notfalls läßt mysql sich noch im Join zur Verwendung eines bestimmten Index
"zwingen" (quasi die "Wink mit dem Zaunpfahl Methode") schau dazu im
Handbuch mal bei den Joins nach.

Grüße
Michael Donning

-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive