mysql: abfrage-optimierung mit joins?
norman
- datenbank
0 Axel Richter0 norman
einen wunderschönen!
ich hoffe ihr könnt mir einem tip zur optimierung meiner mysql-abfrage in puncto joins geben. folgende tabellen:
tab_name
id_name name
1 xxx
2 yyy
3 zzz
4 xxx
tab_werte
id wert
1 11
1 12
2 13
3 12
3 11
3 10
4 13
tab_wert_name
wert_id wert_name
10 abc
11 def
12 ghi
13 jkl
wie bestimme ich die anzahl von "wert" des namens "xxx"?
SELECT wert_name, COUNT(wert) FROM tab_name, tab_werte, tab_wert_name WHERE wert_id = wert AND id_name = id AND name = "xxx"
diese abfrage funktioniert, ist aber recht langsam (bei 2,5 mio. sätze). würde mit joins (left, right?) eine performancesteigerung erzielbar sein? wie sieht die abfrage mit joins aus?
gruß
norman
Hallo,
ich hoffe ihr könnt mir einem tip zur optimierung meiner mysql-abfrage in puncto joins geben. folgende tabellen:
tab_name
id_name name
1 xxx
2 yyy
3 zzz
4 xxxtab_werte
id wert
1 11
1 12
2 13
3 12
3 11
3 10
4 13tab_wert_name
wert_id wert_name
10 abc
11 def
12 ghi
13 jklwie bestimme ich die anzahl von "wert" des namens "xxx"?
SELECT wert_name, COUNT(wert) FROM tab_name, tab_werte, tab_wert_name WHERE wert_id = wert AND id_name = id AND name = "xxx"
Was erwartest Du hier als Ergebnis für wert_name und COUNT(wert)? Die Abfrage ist nämlich syntaktisch falsch, weil eine Aggregatfunktion eine Gruppierung benötigt. MySQL erlaubt das trotzdem, bringt allerdings keine _eindeutigen_ Ergebnisse. Der Nutzer xxx hat:
wert_name wert
def 11
ghi 12
jkl 13
Soll count jetzt 3 bringen? Welchen Wert soll dann wert_name haben?
Korrekte Syntax wäre:
SELECT Count(tab_werte.wert) FROM tab_name INNER JOIN (tab_werte INNER JOIN tab_wert_name ON tab_werte.wert = tab_wert_name.wert_id) ON tab_name.id_name = tab_werte.id
GROUP BY tab_name.name HAVING tab_name.name="xxx";
Die Performance hängt allerdings hauptsächlich von den Indexen ab. Hier wären welche auf tab_werte.id, tab_werte.wert, tab_name.id_name, tab_name.name und tab_wert_name.wert_id wirksam.
viele Grüße
Axel
schönen dank,
werde die syntax gleich mal ausprobieren!!!
norman