Datenbankabfragen cachen/effizienter machen

Hey, ich habe recht große und aufwändige datenbankabfragen, die artikel mit bestimmten eigenschaften suchen. anhand der gefunden artikel wird ein formular aufgebaut bzw. dropdown-menüs. um es konkret zu sagen, ich baue ein reifensuch-formular, das genauso funktionieren soll wie das von reifen.com. das problem bei mir ist, dass mein formular nur sehr langsam auf änderungen der dropdownboxen reagiert, weil bei jeder änderung eine neue db-abgrage erfolgt. mein formular braucht ca. 3sek. bis ich die anzahl der ergebnisse sehe. daher habe ich mir gedacht, dass wenn es schon keine fertigen shopware methoden gibt, die nach bestimmten artikeleigenschaften filtern, so könnte ich doch meine abfrage über den datenbank-cache laufen lassen, quasi wie „sql prepared statements“ bei denen sich nur die parameter ändern und der befehl selbst schon vorgeladen wird. ich bitte um vorschläge, wie ich meine abfragen so effizient wie möglich gestalten kann. meine größte abfrage sieht so aus: select count(distinct a.id) as anzahl from s\_articles a left join s\_filter\_values AS v ON v.articleID = a.id left join s\_filter\_values AS v1 ON v1.articleID = a.id left join s\_filter\_values AS v2 ON v2.articleID = a.id left join s\_filter\_values AS v3 ON v3.articleID = a.id left join s\_filter\_values AS v4 ON v4.articleID = a.id left join s\_filter\_values AS v5 ON v5.articleID = a.id left join s\_filter\_values AS v6 ON v6.articleID = a.id left join s\_filter\_values AS v7 ON v7.articleID = a.id left join s\_filter\_values AS v8 ON v8.articleID = a.id left join s\_filter\_values AS v9 ON v9.articleID = a.id left join s\_filter\_options o ON o.id = v.optionid left join s\_articles\_supplier s ON s.id = a.supplierID where v.value = 'sum' AND v2.value = '180' AND v3.value= '40' AND v4.value = '17' AND (11-cast(SUBSTR(v9.value, 4) as unsigned))\<=5 AND v6.value = 'xl' AND v7.value = 'c' AND v5.optionid IN ( SELECT s\_filter\_options.id FROM s\_filter\_options LEFT JOIN s\_filter\_values ON s\_filter\_options.id = s\_filter\_values.optionid where s\_filter\_options.id=29 and s\_filter\_values.value IS NOT NULL) AND v8.optionid IN ( SELECT s\_filter\_options.id FROM s\_filter\_options LEFT JOIN s\_filter\_values ON s\_filter\_options.id = s\_filter\_values.optionid where s\_filter\_options.id=32 and s\_filter\_values.value IS NOT NULL) vielen dank im voraus

Hallo, grundsätzlich gestaltet sich das Optimieren von Queries ohne Dump der verwendeten Tabellen relativ schwierig, aber aus Erfahrung würde ich sagen, dass das Hauptproblem (aus Performancesicht) bei dieser Abfrage bei den Subselects im Where-Teil zu finden ist. MySQL optimiert diese leider nicht so gut wie andere RDBMS. Entweder muss man diese als Join umformulieren, oder, falls dies nicht möglich ist, kann man die Subselects separat ausführen und die Ergebnismengen dann jeweils in die Hauptabfrage einfügen bevor man diese schlussendlich ausführt.

1 Like