Seitenladegeschwindigkeit in Kategorien

@Teddie sicher, dass man die nicht löschen kann?
Der SQL steht in der Shopware 6 Doku bei den SQL Sachen. Dort sind auch die Queries für Bestellungen, Kunden usw löschen.

Ich hatte nach der Installtion und Migration von SW6 einmal die Datenbank mittel php Script neu eingespielt. Eventuell ist hier etwas passiert, was nicht sein durfte.

Ich versuche das selbe wie du, nach und nach die Probleme mit irgendwelchen Programmierungen umgehen.
Bei SW5 konnte man viel mehr mit den Produkten über die DB machen, unter SW6 geht das nur noch über die API. Und wenn man dort mal mehr als 100 Artikel ändern will mit dem _sync, dann läuft das Script schon lang.

Dieses Ticket hier beschreibt exakt mein Problem:

Ich habe die DB Anfragen einmal im phpmyadmin in der Liveüberwachung beobachtet, exakt dann, wenn eine solche Datenabnkabfrage kommt, hakt es. Es ist die gleiche, die in dem Ticket steht:

SELECT COUNT(*) FROM (# cms::product-listing::search-ids SELECT `product`.`id` FROM `product` LEFT JOIN `product` `product.parent` ON `product`.`parent_id` = `product.parent`.`id` AND `product`.`version_id` = `product.parent`.`version_id` LEFT JOIN `product_visibility` `product.visibilities` ON `product`.`visibilities` = `product.visibilities`.`product_id` AND `product`.version_id = `product.visibilities`.product_version_id LEFT JOIN `product_category_tree` `product.categoriesRo.mapping` ON `product`.`id` = `product.categoriesRo.mapping`.`product_id` AND `product`.`version_id` = `product.categoriesRo.mapping`.`product_version_id` LEFT JOIN (SELECT `product.translation`.product_id, `product.translation`.product_version_id, `product.translation`.meta_description as `product.translation.metaDescription`, `product.translation`.name as `product.translation.name`, `product.translation`.keywords as `product.translation.keywords`, `product.translation`.description as `product.translation.description`, `product.translation`.meta_title as `product.translation.metaTitle`, `product.translation`.pack_unit as `product.translation.packUnit`, `product.translation`.pack_unit_plural as `product.translation.packUnitPlural`, `product.translation`.custom_search_keywords as `product.translation.customSearchKeywords`, `product.translation`.slot_config as `product.translation.slotConfig`, `product.translation`.custom_fields as `product.translation.customFields`, `product.translation`.created_at as `product.translation.createdAt`, `product.translation`.updated_at as `product.translation.updatedAt`, `product.translation`.product_id as `product.translation.productId`, `product.translation`.language_id as `product.translation.languageId`, `product.translation`.product_version_id as `product.translation.productVersionId` FROM `product_translation` `product.translation` WHERE `product.translation`.language_id = '/?_???Mp?XT?|??') `product.product_translation` ON `product.product_translation`.`product_id` = `product`.`id` AND `product.product_translation`.product_version_id = `product`.version_id LEFT JOIN (SELECT `product.parent.translation`.product_id, `product.parent.translation`.product_version_id, `product.parent.translation`.meta_description as `product.parent.translation.metaDescription`, `product.parent.translation`.name as `product.parent.translation.name`, `product.parent.translation`.keywords as `product.parent.translation.keywords`, `product.parent.translation`.description as `product.parent.translation.description`, `product.parent.translation`.meta_title as `product.parent.translation.metaTitle`, `product.parent.translation`.pack_unit as `product.parent.translation.packUnit`, `product.parent.translation`.pack_unit_plural as `product.parent.translation.packUnitPlural`, `product.parent.translation`.custom_search_keywords as `product.parent.translation.customSearchKeywords`, `product.parent.translation`.slot_config as `product.parent.translation.slotConfig`, `product.parent.translation`.custom_fields as `product.parent.translation.customFields`, `product.parent.translation`.created_at as `product.parent.translation.createdAt`, `product.parent.translation`.updated_at as `product.parent.translation.updatedAt`, `product.parent.translation`.product_id as `product.parent.translation.productId`, `product.parent.translation`.language_id as `product.parent.translation.languageId`, `product.parent.translation`.product_version_id as `product.parent.translation.productVersionId` FROM `product_translation` `product.parent.translation` WHERE `product.parent.translation`.language_id = '/?_???Mp?XT?|??') `product.product_translation.parent` ON `product.product_translation.parent`.`product_id` = `product.parent`.`id` AND `product.product_translation.parent`.product_version_id = `product.parent`.version_id LEFT JOIN `category` `product.categoriesRo` ON `product.categoriesRo.mapping`.`category_id` = `product.categoriesRo`.`id` AND `product.categoriesRo`.`version_id` = `product.categoriesRo.mapping`.`category_version_id` WHERE (`product`.`version_id` = '???jK¾K??u,4%') AND ((((`product.visibilities`.`visibility` >= '30') AND `product.visibilities`.`sales_channel_id` = '????9?N??^????S' AND IFNULL(`product`.`active`, `product.parent`.`active`) = '1') AND `product.categoriesRo`.`id` = '?K>AʯH&?????ďe' AND NOT (`product`.`display_group` <=> NULL) AND NOT (IFNULL(`product`.`is_closeout`, `product.parent`.`is_closeout`) <=> '1' AND `product`.`available` <=> ''))) GROUP BY `product`.`display_group`) total

Jetzt frage ich mich, das soll ja eigentlich in SW6.4 schon seit einem Jahr behoben sein.
Und weiß einer, warum die IDs in der Abfrage so merkwürdig aussehen: version_id` = '???jK¾K??u,4%
???

UUID sind hexadecimal gespeichert. Vermutlich hat es etwas mit der Codierung zu tun.

Hier sind die Übeltäer :slight_smile:

Allerdings habe ich keine Ahnung was die Query wirklich macht.

cms::product-listing::search-ids
Als erstes zieht er sich 24 Produkte, egal ob in der Kategorie überhaupt Produkte zugeordnet sind. Immer 24, auch auf der Startseite, warum auch immer.

cms::product-listing::aggregation::properties
Als nächstes zieht er sich scheinbar die zugeordneten Eigenschaften von allen Produkten in der Kategorie und ihren Unterkategorien, von ganz oben bis ganz unten. Ich bin immer noch in der Kategorie wo kein einziges Produkt angezeigt wird.
Er findet dann 111 Eigenschaften Ids, die bei bis zu 10.000 Proukten zugeordnet sind. Also zB eine Eigenschaft ID ist bei 10088 Produkten zugeordnet.

cms::product-listing::aggregation::options
Dann zieht er sich scheinbar noch die Optionen. Sind das die Varianten?

Wenn man die Queries in phpmyadmin das erste Mal ausführt, dauert es genauso lang wie im Frontend. Bei zweiten Mal sind es dann nur noch 0,0056 Sekunden, also merkt man kaum.

Ich habe das noch nie in phpmyadmin gesehen, dass sich exakt identische Anfragen kurz hintereinander so stark von der Geschwindigkeit abweichen…

2 „Gefällt mir“

Nur für den Fall, dass sich einer mal keine Gedanken mehr um die Performance und Ladezeiten seines Shops machen will, hier mal eine Lösung dafür.

Unbelassene Shopware 6 Demo Installation:
ca. 50.000 Artikel
installiert auf einem Shared Hosting

@litecache ja cool.
Dann sag mal, wie das umzusetzen ist :slight_smile:

Vergleichsweise einfach. :slight_smile:

Zunächst brauchst Du mal einen anderen Webserver. Klingt schon mal wie ein K.O. Argument, aber das ist gar nicht so schwer oder umständlich. Das könnte so gar meine nicht mehr vorhandene Oma. :frowning: Problem daran ist nur, dass Du bei den Providern in Deutschland diesen Webserver nur ganz selten vorinstalliert bekommst und wenn, dann nur auf Shared Hosting. Das wäre zwar wie man an der Demo sieht, kein Problem, aber ein VPS für einen Shopware sollte es dann zumindest schon sein. Noch besser wäre natürlich ein dedizierter Server, ist aber kein Muss.

Wenn wir das mit dem Webserver mal außen vor lassen, hättest Du damit eigentlich schon (fast) alles, was Du dafür brauchst, weil das, was so ziemlich jede PHP Anwendung zum Fliegen bringt, ist bei dem Webserver schon dabei.

So, und jetzt kommen wir mal auf den Punkt. Der Webserver heißt LiteSpeed, den es schon seit über 20 Jahren gibt. In aller Welt beliebt und gehört zu den Top 3, aber die hiesigen Provider sperren sich dagegen. Ich weiß zwar warum, aber das ist ein anderes Thema.

Dieser Webserver ist also nix Neues. Der hat mehr mit nginx gemein als mit Apache, allerdings nutzt er die Directiven und httpd.conf nebst .htaccess von Apache. Heißt im praktischen, dass wenn man vorher schon Apache hatet, alles beim Alten bleibt. Die Installation dauert keine 5 Min., kann im laufenden Betrieb durchgeführt und danach irgendwas geändert werden muss auch nichts. Eigentlich ist es so als würde man von Apache zu Apache wechseln, nur eben bis zu 1000 x schneller und mit. mind. 50% weniger Last. Gleichermaßen könnte man das auch auf die Hosting Kosten übertragen.

Damit Dein Shop nun fliegt, brauchst Du einen HTTP Cache oder Fullpage Cache. Dieser ist bei dem besagten Webserver schon all inkl… Wenn Du vielleicht Varnish kennst für den man einen Proxy braucht, ist bei diesem Cache alles von Grund auf anders und vor allen Dingen einfacher und schneller sowieso. Dieser Webserver ist für die breite Masse ausgelegt. Das Gleiche gilt auch für den Cache. Daraus kannst Du schlussfolgern, dass die Anforderungen minimalistisch sind, aber die Leistung von z.B. nginx + Varnish, bzw. FastCGI in Grund und Boden versenkt.

Irgendwo gibt es dann aber auch einen Haken, leider. Der Hake besteht darin, dass sich dieser Cache verhält, wie ein Formel 1 Auto, allerdings immer Vollgas fährt und weder Bremsen noch eine Lenkung hat. Es braucht also noch ein Stück Software, das dem Cache sagt, was er darf und was er nicht darf. Andernfalls wird nämlich alles gecacht und das wäre in einem Online Shop tödlich, wo es doch durch einen Fullpage Cache weder Sessions noch irgendweine Dynamik mehr gibt, aber genau dafür ist dieses zusätzlich Stück Software notwendig. Diese Software ist nicht universal, sondern muss für jede Software angepasst, bzw. unterschiedlich sein. Für einige Anwendungen wie z.B. Wordpress, Magento und noch ein paar andere Anwendungen gibt es Plugins dafür, teilweise auch kostenlos, aber eben nicht für Shopware 6. Für die 5er Version gibt es zwar was, aber der Provider in D, der das Hosting dafür anbietet, rückt die Software nicht raus. Du kannst sie als Kunde, zwar nutzen, aber eben nicht kaufen und damit woanders hingehen.

Bei der 6er Version bist aber bei mir an der richtigen Adresse. :slight_smile:

Es gäbe noch viel mehr darüber zu erzählen, aber frag erstmal weiter…