alleine diese speicherung scheint mir schon eine denormalisierung zu sein. das ist grundsätzlich kein beinbruch, sollte aber bewußt geschehen. die frage ist, woran erkennt man den die "beliebtesten artikel" und ob man diese artikel noch extra persisiteren muss oder nicht schon aus den vorhanden daten herleiten kann. aber nun zu deinem problem.
Also ein Problem ist, dass alle paar Minuten neue Artikel (zB neue Farben) in die Liste aufgenommen werden. Ebenso kann auch von einer Minute auf die andere eine Farbe wieder aus der Tabelle verschwinden. Deswegen kann ich die verfügbaren Farben nicht direkt in der favs-Tabelle speichern, da diese dynamisch ausgelesen werden müssen.
zum einen benutzt du bei der korrelation in der unterabfrage funktionen. dadruch kann ein eventuell vorhandener index nicht greifen, jendefalls nicht solange das dbms keine funktionallen indexe kennt. diese zu beheben erfordert ein wenig mehr wissen über die beiden tabellen fav und article und wie die beiden tabellen genau miteinander verbunden sind. wäre gut, wenn du dazu noch ein paar infos geben könntest.
Direkt verbunden sind 2 Datensätze eben leider nicht. In der Tabelle articles kann ein Datensatz einer Farbe auch mehrfach vorkommen, da der Artikel in verschiedenen Shops zur Verfügung steht.
Man kann sie demnach nur über den Artikelnamen (ohne Farbe) zuweisen.
zum anderen erscheint es mir, als wenn erst mal alle datensätze von fav genommen werden udn darauf eben immer korrelierte unterabfragen ausgeführt werden und dann erst die anzahl auf 20 begrentzt wird. das liegt an der tatsache, dass er erst einmal die ergebnisse alle ergebnisse der tabelle fav haben will, um sie dann zu sortieren und die 20 ersten entsprechend auszuwählen. um dieses zu testen könntest du nur mal testweise das ORDER BY weglassen udn nur das LIMIT verwenden. sollte dies wirklich ein problem sein, kannst du zuerst in der FROM klausel eine unterabfrage einbauen, die dir zuerst die 20 datensätze aus der tabelle fav liefert, ohne die korrleirerte unterabfrage auszuführen und dann erst später im äußen SELECT diese wieder hinzugefügt wird.
Das mit der Unterabfrage habe ich versucht. Das bringt leider keinen Geschwindigkeitsvorteil.
Gruss
Helmo