Ik heb een probleem. Ik ben een interne prijsvergelijker voor een grote webwinkel aan het maken, zodat we snel kunnen zien of we goedkoop genoeg zijn
Het overzicht wordt gesorteerd op polulariteit, dus het product dat het meest verkocht is bovenaan. Hiervoor speelt de volgende query een belangrijke rol:
Als ik de GROUP BY laat staan, maar de ORDER BY zo verander dat er alleen op products_id wordt gesorteerd duurt de query nog maar 0,02s tot 0,05s. Dat is de snelheid die ik zoek! Maar dan staan ze in min-of-maar willekeurige volgorde.
Er zijn indexes op alle relevante kolommen, maar de index op products_ordered lijkt geen invloed te hebben. De query wordt niet sneller of langzamer als ik de key verwijder of opnieuw aanmaak.
De products tabel bestaat uit ruim 17.000 producten, maar er zijn maar 144 verschillende waardes voor products_ordered. De kardinaliteit is dus slechts een honderdste van de hele tabel, en nog stecht verdeeld ook. Veel producten zijn niet of maar een paar keer gekocht. Dat maakt de index vrijwel waardeloos.
Kan ik hier iets aan doen, of moet ik er gewoon meer hardware tegenaan smijten?
Of gewoon mensen meer laten kopen zodat de kardinaliteit vanzelf beter wordt
SQL:
Dit duurt 0,8s op mijn lokale dev-machine. Zonder GROUP BY nog 0,10s tot 0,15s. Dat is al een groot verschil, maar het is nog te langzaam. En als ik dit niet doe verschijnen sommige producten bij een van onze concurrenten dubbel. Zij hebben ergens de verkeerde ean-codes ingevuld...1
2
3
4
5
6
7
8
9
| SELECT p.products_id, p.products_ordered, p.prijs as onze_prijs, a.adviesprijs as adviesprijs, c1.prijs as c1_prijs, c2.prijs as c2_prijs FROM products p LEFT JOIN adviesprijzen a ON a.EANcode = p.EANcode LEFT JOIN feed_concurrenten c1 ON p.EANcode = c1.EAN AND c1.naam = 'concurrent1.nl' LEFT JOIN feed_concurrenten c2 ON p.EANcode = c2.EAN AND c2.naam = 'concurrent2.nl' WHERE p.EANcode != '' AND p.products_status = 1 GROUP BY p.products_id ORDER BY p.products_ordered DESC, p.products_id ASC |
Als ik de GROUP BY laat staan, maar de ORDER BY zo verander dat er alleen op products_id wordt gesorteerd duurt de query nog maar 0,02s tot 0,05s. Dat is de snelheid die ik zoek! Maar dan staan ze in min-of-maar willekeurige volgorde.
Er zijn indexes op alle relevante kolommen, maar de index op products_ordered lijkt geen invloed te hebben. De query wordt niet sneller of langzamer als ik de key verwijder of opnieuw aanmaak.
De products tabel bestaat uit ruim 17.000 producten, maar er zijn maar 144 verschillende waardes voor products_ordered. De kardinaliteit is dus slechts een honderdste van de hele tabel, en nog stecht verdeeld ook. Veel producten zijn niet of maar een paar keer gekocht. Dat maakt de index vrijwel waardeloos.
Kan ik hier iets aan doen, of moet ik er gewoon meer hardware tegenaan smijten?
Of gewoon mensen meer laten kopen zodat de kardinaliteit vanzelf beter wordt