norman: mysql: abfrage-optimierung mit joins?

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

  1. 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       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"

    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

    1. schönen dank,
      werde die syntax gleich mal ausprobieren!!!

      norman