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

Abfrage dauert manchmal ewig

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von skeee, 22 Januar 2015.

  1. skeee

    skeee Neuer Benutzer

    Hallo zusammen,
    Ich hoffe, ihr könnt mir helfen:
    Ich habe eine Abfrage, die manchmal super schnell abläuft (100-200ms), aber manchmal bis zu 15Min dauert und ich habe keine Ahnung, woran das liegt. Die Menge an gespeicherten Daten ist aktuell auch noch sehr überschaubar, so dass ich keine Ahnung habe, was das Problem verursacht.
    Hier mal meine Query:
    Code:
    SELECT DISTINCT
            u.id as user_id,
            u.email as user_email,
            u.company as user_company,
            u.address as user_address,
            u.hausnummer as user_hausnummer,
            u.plz as user_plz,
            u.city as user_city,
            u.qualificationIndex as user_qualificationIndex,
            u.logo as user_logo,
            u.userLevel as user_userLevel,
            u.description as user_description,
            c.id as categorie_id,
            c.name as categorie_name,
            cs.id as categorie_sub_id,
            cs.name as categorie_sub_name,
            a.id as action_id,
            a.name as action_name,
            w.id as workspace_id,
            w.name as workspace_name,
            l.id as language_id,
            l.name as language_name,
            b.id as branche_id,
            b.name as branche_name
            FROM
            users u,
            users_to_categories utc,
            users_to_categories_sub utcs,
            users_to_actions uta,
            users_to_workspaces utw,
            users_to_languages utl,
            users_to_branchen utb,
            categories c,
            categories_sub cs,
            actions a,
            workspaces w,
            languages l,
            branchen b
            WHERE
            u.isProvider=1 AND
            utc.categorie_id >=0 AND
            utcs.categorie_sub_id >=0 AND
            uta.action_id >=0 AND
            utw.workspace_id >=0 AND
            utl.language_id >=0 AND
            utb.branche_id >=0 AND
          
            u.id=utc.user_id AND
            u.id=utcs.user_id AND
            u.id = uta.user_id AND
            u.id=utw.user_id AND
            u.id=utl.user_id AND
            u.id=utb.user_id AND
            utc.categorie_id = c.id AND
            utcs.categorie_sub_id =cs.id AND
            uta.action_id =a.id AND
            utw.workspace_id=w.id AND
            utl.language_id = l.id AND
            utb.branche_id = b.id
          
            ORDER BY u.qualificationIndex 
    Ich habe auch mal mit EXPLAIN die Query analysiert und da sehe ich jetzt auch nichts, was für diese unglaublich lange Laufzeit verantwortlich sein könnte. Ich habe mal einen Screenshot als Anhang mit rein gepackt.
    Wäre super, wenn mir irgendjemand nur einen kleinen Hinweis geben könnte, oder mich in die richtige Richtung stupsen könnte.

    Danke
    Skee
     

    Anhänge:

    • sql.png
      sql.png
      Dateigröße:
      101,3 KB
      Aufrufe:
      3
  2. akretschmer

    akretschmer Datenbank-Guru

    Ja, neee, is klar. das MySQL-Explain ist halt für die Tonne.

    Stelle Deine Abfrage erst einmal auf expliziete JOIN-Syntax um. Noch besser: stelle die DB auf eine richtige um.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Bist Du Dir sicher, daß das so sein soll? Das sieht mir, *hüstel*, nicht gesund aus.
     
  4. skeee

    skeee Neuer Benutzer

    Was ist daran nicht gut? Ich brauche in jeder dieser tables den match mit u.id, daher wüsste ich ad hoc nicht, was ich besser machen kann.
    Aber ich bin ja bereit, was zu lernen, so ist es ja nicht ;)

    Mit JOINS bin ich aktuell noch nicht so fit, daher würde ich gerne die aktuelle abfrage so optimieren, dass sie erstmal läuft und nicht 15min und mehr benötigt. Dass ich mittelfristig auf JOIN umstellen sollte weiß ich und werde ich auch machen, aber kurzfristig müsste ich das so erstmal zum Laufen bekommen. Teach me master :)
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Du verwendest denselben Schlüssel in versch. Tabellen. Der Sinn erschließt sich mir nicht.

    Mach das. Also, Du machst das jetzt schon, nur sind das 'versteckete' Joins. Bei dieser Syntax (wie Du es machst) schleichen sich viel schneller Fehler ein. Bei einer sauberen JOIN-Syntax trennst Du klar die Join-Conditions von den Where-Conditions.
     
  6. skeee

    skeee Neuer Benutzer

    Da kann ich dir nicht widersprechen.
    Was mich nur fertig macht: Die Query funktioniert, also liefert korrekte Daten. Und sie lief schon verdammt schnell, tut es jetzt aber eben nicht. Und ich weiß nicht wieso. Die Daten haben sich, wenn überhaupt nur geringfügig geändert.

    Den Schlüssel verwende ich deshalb mehrfach, weil ja in jeder dieser Tabellen u.id mit einem Wert verknüpft ist. Also einmal u.id mit c.id, dann u.id mit cs.id, etc. Ich wüsste jetzt nicht wie man das anders darstellt
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Tja. so ist das halt, wenn Dinge 'kippen' ...

    Dummerweise ist der Explain-Output von Explain (bei MySQL) vollständig für die Tonne...

    Nehmen wir mal "u.id=utl.user_id": wenn 5 User dieselbe Sprache haben (sagen wir mal deutsch) hast Du auch in Deiner Sprachen-Tabelle 5 mal 'deutsch'. Macht wenig Sinn. Oder ich versteh Dich falsch.

    Da wäre es besser, in der Sprachen-Tabelle je Sprache ein Eintrag zu haben und den Primary Key dieser Tabelle als Foreign Key in Deiner User-Tabelle zu haben. Oder in einer weiteren Zwischen-Tabelle, da manche Leute auch mehr als eine Sprachen beherrschen.
    Das sind so Dinge, die man sich am Anfang sehr genau überlegen sollte.
     
  8. skeee

    skeee Neuer Benutzer

    Also, ich habe eine Tabelle users u und eine Tabelle languages l und eine Tabelle users_to_languages utl und in letzterer stehen nur die Ids der user mit den entsprechenden Ids der languages. Das ist doch so korrekt,oder nicht?
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Vielleicht hab ich auch einfach nur Deine Syntax nicht verstanden... wie schon gesagt: saubere JOIN-Syntax und so...
     
  10. ukulele

    ukulele Datenbank-Guru

    Das ist korrekt wenn ein User mehrere Sprachen haben kann. Wenn du nur eine Sprache hinterlegst reicht ein Fremdschlüssel in der Tabelle u auf die Tabelle l.
     
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