meine Shopware-Installation sorgt leider immer wieder für SQL Queries, die kein Ende finden. Das geht natürlich extrem zu Lasten der Performance. Es handelt sich (scheinbar) um ein Query zum Abrufen von verwandten Artikeln. Abgefeuert wird es wohl beim Aufruf eines Artikels - komisch ist jedoch, dass die jeweiligen Artikel, bei denen das Problem auftritt, deaktiviert sind. Sie sollten somit eigentlich gar nicht aufgerufen werden. Hier ein Beispiel eines solchen Queries:
SELECT a.id as articleID, a.name as articleName, IF(s.id, 2, 0) + IF(s2.id, 1, 0) as relevance
FROM s_articles a INNER JOIN s_articles_categories_ro ac
ON ac.articleID=a.id AND ac.categoryID = 3
INNER JOIN s_categories c
ON c.id = ac.categoryID AND c.active = 1
LEFT JOIN s_articles_avoid_customergroups ag
ON ag.articleID=a.id AND ag.customergroupID=1
LEFT JOIN s_articles o
ON o.id=1680
LEFT JOIN s_articles_similar s
ON s.articleID=o.id AND s.relatedarticle=a.id
LEFT JOIN s_articles_categories_ro s1
ON s1.articleID=o.id
LEFT JOIN s_articles_categories_ro s2
ON s2.categoryID=s1.categoryID AND s2.articleID=a.id
WHERE a.active = 1 AND ag.articleID IS NULL AND a.id!=1680 GROUP BY a.id ORDER BY relevance DESC LIMIT 4
“relevance” sieht mir eher nach einem Filter oder einer Sortierung aus.
Hier sind durchaus einige Einstellungen in Shopware, die den Shop völlig schrotten können… Hatten wir hier schon mit Preisen. Da Preise pro Variante und Kundengruppe erzeugt werden ist die Tabelle schnell unglaublich groß und beim JOIN prices mit details kommen die heftigsten Tabellen zusammen…
Würde vorschlagen mal bei den Filtern/Sortierungen zu schauen was ihr wirklich braucht und testweise einfach mal das Ein oder Andere abzuschalten.
was bedeutet in dem Fall „…die kein Ende finden“? Hast du diese Information aus der Slow-Query Log Datei?
Was passiert denn zum Beispiel in PHPMyAdmin, wenn du den SQL Befehl dort folgender maßen ausführst:
EXPLAIN SELECT a.id as articleID, a.name as articleName, IF(s.id, 2, 0) + IF(s2.id, 1, 0) as relevance
FROM s_articles a INNER JOIN s_articles_categories_ro ac
ON ac.articleID=a.id AND ac.categoryID = 3
INNER JOIN s_categories c
ON c.id = ac.categoryID AND c.active = 1
LEFT JOIN s_articles_avoid_customergroups ag
ON ag.articleID=a.id AND ag.customergroupID=1
LEFT JOIN s_articles o
ON o.id=1680
LEFT JOIN s_articles_similar s
ON s.articleID=o.id AND s.relatedarticle=a.id
LEFT JOIN s_articles_categories_ro s1
ON s1.articleID=o.id
LEFT JOIN s_articles_categories_ro s2
ON s2.categoryID=s1.categoryID AND s2.articleID=a.id
WHERE a.active = 1 AND ag.articleID IS NULL AND a.id!=1680 GROUP BY a.id ORDER BY relevance DESC LIMIT 4
die Abfragen laufen teilweise 20 Minuten, sodass wir sie per Hand abbrechen. Die Info stammt aus den aktiven laufenden Prozessen, nicht dem Slow-Query Log.
vielen Dank für den Screenshot. Das hört sich recht seltsam an. An dem Query sehe ich jetzt aber kein problem.
Wie lang brauch der Query ohne EXPLAIN in PHPMyAdmin zur ausführung?
Sind alle Shopware Cache-Funktionen aktiviert?
Wo ist der Shop gehostet? Ist das ein offizieller Shopware Hosting Partner?
Wie lange brauch z.B. der folgende Befehl?:
SELECT a.id as articleID, a.name as articleName, IF(s.id, 2, 0) + IF(s2.id, 1, 0) as relevance
FROM s_articles a INNER JOIN s_articles_categories_ro ac
ON ac.articleID=a.id AND ac.categoryID = 3
INNER JOIN s_categories c
ON c.id = ac.categoryID AND c.active = 1
LEFT JOIN s_articles_avoid_customergroups ag
ON ag.articleID=a.id AND ag.customergroupID=1
LEFT JOIN s_articles o
ON o.id=1680
LEFT JOIN s_articles_similar s
ON s.articleID=o.id AND s.relatedarticle=a.id
LEFT JOIN s_articles_categories_ro s1
ON s1.articleID=o.id
LEFT JOIN s_articles_categories_ro s2
ON s2.categoryID=s1.categoryID AND s2.articleID=a.id
WHERE a.active = 1 GROUP BY a.id ORDER BY relevance
Im grunde sollte aber euer Hoster euch hier weiter helfen können um z.B. eine fehlkonfiguration von MySQL auszuschließen. Hast du dort bereits nachgefragt?
da scheint anscheinend etwas mit den Server-Einstellungen nicht zu stimmen. Bei uns dauert der Aufruf nicht so lange! Eventuell ist die my.cnf nicht korrekt eingestellt oder der Server verfügt nicht mehr über genug freie Ressourcen. Da würde ich aber jetzt in eine Glasskugel schauen, da der Flschenhals an mehreren Stellen auftreten könnte.
Ich würde dir zu Testzwecken eine Datenbank von uns zur verfügung stellen, wo du den SQL Query einmal testen kannst. Dann kannst du die Zeiten vergleichen. Wir können dir aber auch ein Testpaket erstellen wo du selbst rum experamentieren kannst. Dann kanst du zumindest ausschließen, ob der Fehler an der Datenbank liegt oder an den Einstellungen.
Also normal ist das nicht, auch nicht, dass dann ein Gateway-Timeout entsteht.
wir konnten das Problem vermutlich bereits beheben. Wir haben herausgefunden, dass das Query ausgeführt wird, wenn ein deaktivierter Artikel im Frontend aufgerufen wird. Die Einstellung war so, dass in diesem Fall ähnliche Produkte als Alternative angezeigt werden sollen. Da wir viele Produkte mit noch viel mehr Kategorien im Shop haben, kam diese Datenbankabfrage offensichtlich an ihre Grenzen. Wir haben nun die Einstellungen hinsichtlich deaktivierter Artikel geändert. Nun scheint es kein Problem mehr zu geben.