Hallo zusammen,
ich habe ein kleines Problem beim erstellen eines E-Commerce Portals, auf Basis von symfony3.
Hier ist ein Beispiel der zugrundeliegenden Tabelle auf MySQL Seite: https://picload.org/image/rdcdwoig/db_example.png
Wie man sieht, existiert nur eine Produkttabelle, woher ich Daten selektiere. Keine umständlichen Joins zwischen verschiedenen Tabellen, welche der Geschwindigkeit schaden könnten.
Hier ist ein kleines Mockup des aktuellen Standes, den ich habe um zu verdeutlichen was ich rendern möchte: https://picload.org/image/rdcdwoid/wireframe.jpg
Der Anwendungsfall ist folgender: ich möchte eine gefilterte Produktansicht anzeigen (zum Beispiel "zeige mir alle Produkte mit der Farbe grün"). Anschließend erhält man die entsprechenden Produkte (roter Bereich im Mockup) + sowie in der Sidebar die Möglichkeit weitere Filter auf Basis der bereits gefilterten Produktcollection anzuwenden (z. B. Marken oder Größen, in der Praxis gibt es noch wesentlich mehr Filtermöglichkeiten; gelber Bereich).
Das Problem dabei ist, wie man sehen kann, dass ich für jedes Ergebnis eine andere angepasste Query nutze (z. B. in der Sidebar mit verschiedenen "GROUP BY" Statements), jedoch darin immer die selbe Subquery eingesetzt wird ("FROM products WHERE [aktuelle Filter]"), welche die aktuelle Produktcollection darstellt.
Dieser Umstand drückt die Geschwindigkeit meiner Seite immens (über eine Million Produkte in der Datenbank und ich brauche ca. 7-8 mal die eigentlich selbe Query mit jeweils leicht abgeänderten Parametern).
Ich habe schon eine Lösung gefunden, die leider für mich nicht in Frage kommt. Das wäre der Umstieg der Umgebung auf MariaDB, welches Subquery Caching ermöglicht. Dieser Umstieg ist in der aktuellen Umgebung leider nicht möglich. Ein Caching durch MySQL ist bereits aktiviert.
Kann mir irgendjemand ein Paar Hinweise oder Hilfestellungen geben, wie ich es schaffe auf clevere Art und Weise die Queries zu vermindern, bzw. den kompletten Prozess ordentlich zu verschnellern. Gibt es da eine bessere Möglichkeit, als wie ich es aktuell mache? Wie würdet ihr da heran gehen?
Vielen Dank schon einmal für euere Hilfe!
ich habe ein kleines Problem beim erstellen eines E-Commerce Portals, auf Basis von symfony3.
Hier ist ein Beispiel der zugrundeliegenden Tabelle auf MySQL Seite: https://picload.org/image/rdcdwoig/db_example.png
Wie man sieht, existiert nur eine Produkttabelle, woher ich Daten selektiere. Keine umständlichen Joins zwischen verschiedenen Tabellen, welche der Geschwindigkeit schaden könnten.
Hier ist ein kleines Mockup des aktuellen Standes, den ich habe um zu verdeutlichen was ich rendern möchte: https://picload.org/image/rdcdwoid/wireframe.jpg
Der Anwendungsfall ist folgender: ich möchte eine gefilterte Produktansicht anzeigen (zum Beispiel "zeige mir alle Produkte mit der Farbe grün"). Anschließend erhält man die entsprechenden Produkte (roter Bereich im Mockup) + sowie in der Sidebar die Möglichkeit weitere Filter auf Basis der bereits gefilterten Produktcollection anzuwenden (z. B. Marken oder Größen, in der Praxis gibt es noch wesentlich mehr Filtermöglichkeiten; gelber Bereich).
Das Problem dabei ist, wie man sehen kann, dass ich für jedes Ergebnis eine andere angepasste Query nutze (z. B. in der Sidebar mit verschiedenen "GROUP BY" Statements), jedoch darin immer die selbe Subquery eingesetzt wird ("FROM products WHERE [aktuelle Filter]"), welche die aktuelle Produktcollection darstellt.
Dieser Umstand drückt die Geschwindigkeit meiner Seite immens (über eine Million Produkte in der Datenbank und ich brauche ca. 7-8 mal die eigentlich selbe Query mit jeweils leicht abgeänderten Parametern).
Ich habe schon eine Lösung gefunden, die leider für mich nicht in Frage kommt. Das wäre der Umstieg der Umgebung auf MariaDB, welches Subquery Caching ermöglicht. Dieser Umstieg ist in der aktuellen Umgebung leider nicht möglich. Ein Caching durch MySQL ist bereits aktiviert.
Kann mir irgendjemand ein Paar Hinweise oder Hilfestellungen geben, wie ich es schaffe auf clevere Art und Weise die Queries zu vermindern, bzw. den kompletten Prozess ordentlich zu verschnellern. Gibt es da eine bessere Möglichkeit, als wie ich es aktuell mache? Wie würdet ihr da heran gehen?
Vielen Dank schon einmal für euere Hilfe!
Kommentar