Ankündigung

Einklappen
Keine Ankündigung bisher.

Symfony: Best-Practice für multiple Filterselektion mit der selben Subquery gesucht

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Symfony: Best-Practice für multiple Filterselektion mit der selben Subquery gesucht

    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:

    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:

    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!

  • #2
    Zitat von cpassion Beitrag anzeigen
    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).
    Stichwort: Facettensuche
    Viel Erfolg. Da haben sich schon andere die Zähne dran ausgebissen. Bei 1M Artikeln nimmt man heute entweder ElasticSearch (wobei ES verrückt schlecht für dieses Anwendungsszenario geeignet ist) oder Solr, wobei Solr eine wesentlich(!) bessere Ausgestaltung der Facetten-Suche hat. Außerhalb der Facettensuche ist ES in vielen Belangen besser und einfacher einzurichten. 1M Datensätze sind für beide Systeme keine besorgniserregende Größe. Du kannst praktisch alles, was eine Liste von Artikeln lädt über Solr/ES abbilden. Für den Datenabgleich mit Solr/ES musst du dir eine Strategie einfallen lassen. Es ist ja auch an dir, welche Funktionen Solr und ES bereitstellen sollen. Wenn man den Preis eingrenzen können soll, dann muss es einen ständig laufenden Preisabgleich geben. Die Artikeldaten müssen auch gelegentlich aktualisiert werden.

    Wenn ich dann das noch anfügen darf: Ich finde deine Tabellenstruktur unflexibel. Was machst du, wenn du Mehrsprachigkeit einführen willst? Oder mehr Attribute? Wenn dieses Modell allerdings so statisch bleibt, wie es aktuell ist, spricht nichts dagegen alles so zu lassen.

    Kommentar


    • #3
      Crosspost: http://phpforum.de/forum/showthread.php?t=283953

      Bitte beachten: "Anmerkungen zu Multipostings" https://www.php.de/articles/regeln-u...renrichtlinien

      [MOD: Geschlossen]
      The string "()()" is not palindrom but the String "())(" is.

      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar

      Lädt...
      X