Diese werden zur Auswahl in Dropdownmenüs im _left.tpl angezeigt. Folgende Abfrage wird dafür benutzt.
SELECT DISTINCT att.oxid, att.oxtitle, att.oxpos, o2a.oxvalue FROM oxattribute AS att, oxobject2attribute AS o2a WHERE att.oxid = o2a.oxattrid AND o2a.oxvalue != '' ORDER BY att.oxpos DESC, o2a.oxvalue+0,REPLACE (o2a.oxvalue,o2a.oxvalue +0,'')
Diese Abfrage dauert bei jedem Seitenaufruf ca. 5 Sekunden.
Lass ich den order by Befehl weg braucht die Abfrage nur 0,01 Sekunden.
Ich brauche aber die Sortierung damit die Listen richtig nach Buchstaben und Zahlen sortiert angezeigt werden.
Hat jemand ne Idee wie ich das Problem lösen kann?
Das Distinct zusammen mit Order By ist ein absoluter killer und wird nie richtig funktionieren. Wie wäre es wenn du dir in aller regelmäßigkeit die notwendigen Daten in eine extra Tabelle schreibst und von da einfach ohne großen distinct etc. nur mit order by ziehst?
Das funktioniert leider nicht. Sobald der Kunde eine Option ausgewählt hat werden nur noch die Atribute der passenden Artikel geladen. Es verändert sich also ständig.
Gibt es denn vielleicht die Möglichkeit die Tabelle mit dem distinct zu holen (was ja sehr schnell geht), die dann zwischenzuspeichern und auf diese dann den order Befehl anzuwenden.
In der Tabelle stehen dann letztendlich nur 1300 Einträge.
wie könnte mann das anstellen und würde es die Performance steigern?
[QUOTE=illmonkey;79582]
Ist denn die Datenbank nicht eigentlich schneller als php beim sortieren?[/QUOTE]Die Datenbank muss zigtausende von Einträgen sortieren, PHP nur einige wenige.
Ich bin dabei zu versuchen die Sortierung mit php zu machen.
Ich hab jetzt den Sortierteil weggelassen und bekomme vom Debugger folgende Meldung:
MissingKeys: 4.771939 - SELECT DISTINCT att.oxid, att.oxtitle, att.oxpos, o2a.oxvalue FROM oxattribute AS att, oxobject2attribute AS o2a WHERE att.oxid = o2a.oxattrid AND o2a.oxvalue != ''
Da steht die Abfrage braucht 4,7 Sekunden und entsprechend langsam lädt auch de Seite.
Wenn ich die Abfrage so kopiere und mit phpmyadmin ausführe braucht sie nur die besagten 0,01 Sekunden.
Da steht die Abfrage braucht 4,7 Sekunden und entsprechend langsam lädt auch de Seite.
Wenn ich die Abfrage so kopiere und mit phpmyadmin ausführe braucht sie nur die besagten 0,01 Sekunden.
[/QUOTE]
Der Zeitunterschied kommt schätze ich daher das bei Aufruf Nr1: der query ausgeführt wird, und bei Aufruf Nr. 2: das gecached Ergebniss, des ersten Aufrufes ausgeliefert wird.
Das mit dem dem Cache kann nicht sein, sonnst würde der Shop das ja selber auch schaffen bei der 2ten Anfrage.
Ich hab das grade auch im Testshop und im Liveshop probiert. Jedesmal nur die 0,01 Sekunden und im Liveshop fand die Abfrage auch vorher nicht statt.
Ihr könnt die Abfrage ja mal in eurem Shop testen. Einmal mit und einmal ohne Sortierung.
Die Tabelle muss bei jedem Aufruf neu geladen werden da sich die Abfrage verändert sobald ein Attribut ausgewählt wird. Die Abfrage oben ist nur auf der Startseite. Wenn ich z.B. in er Kategorie Haken als Material Edelstahl auswähle kommt:
SELECT DISTINCT att.oxid, att.oxtitle, att.oxpos, o2a.oxvalue
FROM oxattribute as att, oxobject2attribute as o2a ,oxcategory2attribute as c2a
WHERE att.oxid = o2a.oxattrid AND c2a.oxobjectid = 'd21418894d025c8ece46590ac5692e24' AND c2a.oxattrid = att.oxid AND o2a.oxvalue !='' AND o2a.oxobjectid IN ('82f3390ded24b7c63d8e892ef1455779','82f430deae80b664062fcfd8e520d042','b1a37dd785d2f97782ef17950062d451','b1ab8d5aa87b352bd04d9d7bc87a0386','b1aea1fd5d9b085664e54faa4709e60c','b1af92dfc0e1bc4521b9b549a69ac415')
Dauer in diesem Fall 0,005 Sekunden. Es werden auch nur 4 Artikel ausgegeben.
Wie stehts damit den Ganzen Bereich der die Pulldowns zur Verfügung stellt über ein extra Templatefetzen und einer kleinen Smartyfunktion zu laden. Das Template bekommt eine cacheid z.B. den hash der aktuell Werte respektive des aktuellen Zustands und wird dann nur noch als fertiges HTML eingebunden. Ohne Rechenoperationen/DB Anfragen. Das dauert dann bis alle Zustände mal dran waren, dann aber sollte es flutschen. Natürlich hast Du dann ein paar zusätzliche Dateien im cache, aber da hats ja Platz.