Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Index bei verschachtelten Abfragen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von fidibus, 26 Oktober 2014.

  1. fidibus

    fidibus Neuer Benutzer

    Hallo,

    bin neu hier Forum, habe eine Frage zu einer verschachtelten Abfrage, die mir die Abfrageperfomance etwas verhagelt:

    Code:
     SELECT DISTINCT `Day` , `Tmax` , `Tmin` , left( `Wcode` , 1 ) AS Wcode, `Wtxt` , `Rain` , `WindDir` , `WindDirtxt`
    FROM `daily_data`
    WHERE id
    IN (
    
    SELECT max( id )
    FROM `daily_data`
    GROUP BY DAY
    )
    ORDER BY `daily_data`.`Day`
    
    Explain liefert mir folgendes Ergebnis:

    Code:
     
    id select_type table type possible_keys key key_len ref rows Extra
    1 PRIMARY daily_data ALL NULLNULLNULLNULL2665 Using where; Using temporary; Using filesort
    2 DEPENDENT SUBQUERY daily_data index NULLDay 3 NULL24 Using index
    
    Meine Frage, wieso wird bei der Subquery 'Day' als Key verwendet, und bei der Primary Query nicht? Wäre echt toll, wenn mir jemand weiterhelfen könnte.

    Viele Grüße
    Fidibus
     
  2. Hony%

    Hony% Datenbank-Guru

    Durch den Subselect erzeugst du eine temporäre Menge für die kein Index besteht.

    Das passiert häufig bei Subselects. Deutlich performanter sind für gewöhnlich JOINS.

    Versuchs mal damit:
    Code:
    SELECT A.*
    FROM fidibus AS A
    INNER JOIN  (
      SELECT Max(id) AS id
      FROM fidibus
      GROUP BY Day
    ) AS B
    ON A.id = B.id
    ORDER BY A.day
    
    Passt natürlich noch nicht ganz. Aber das Prinzip sollte klar sein.

    Gruß
    Hony
     
    Zuletzt bearbeitet: 26 Oktober 2014
    ukulele gefällt das.
  3. akretschmer

    akretschmer Datenbank-Guru

    Was soll eigentlich das innere Select? Also, das GROUP BY?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    ach ne, ist okay ;-)
     
  5. fidibus

    fidibus Neuer Benutzer

    Hallo,

    vielen Dank für die Hilfe, klappt prima:

    ALT:
    Code:
    Zeige Datensätze 0 - 29 ( 78 insgesamt, die Abfrage dauerte 3.8467 sek.) [Day: 2014-08-12 - 2014-09-10]
    NEU:
    Code:
    Zeige Datensätze 0 - 29 ( 78 insgesamt, die Abfrage dauerte 0.0054 sek.) [Day: 2014-08-12 - 2014-09-10]

    Viele Grüße
    Fidibus
     
    Hony% gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden