Abfrage dauert manchmal ewig

skeee

Neuer Benutzer
Beiträge
4
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
    101,3 KB · Aufrufe: 3
Werbung:
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.

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.
 
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 :)
 
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 ;)

Du verwendest denselben Schlüssel in versch. Tabellen. Der Sinn erschließt sich mir 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 :)

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.
 
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
 
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.
Tja. so ist das halt, wenn Dinge 'kippen' ...

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

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

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.
 
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?
 
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?

Vielleicht hab ich auch einfach nur Deine Syntax nicht verstanden... wie schon gesagt: saubere JOIN-Syntax und so...
 
Werbung:
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?
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.
 
Zurück
Oben