Ik zit samen met een collega van mij al een tijdje met de handen in het haar omtrent een lastig vraagstuk.
Een klant van ons heeft een webshop met 500.000+ producten. Op zich niets vreemds, maar er zitten een aantal haken en ogen aan:
Het wonderbaarlijke is dat we dit momenteel al werkend hebben, alleen we lopen tegen een probleem aan: het is tergend traag. Een simpel overzicht laden kan soms al 15 seconden duren. De meest voor de hand liggende optimalisaties zijn al gedaan: denk aan indexeren van kortingsprijzen, indexen op tabellen, etc.
De hosting is bij Amazon. 8 cores, 15 GB ram.
Mijn vraag is niet direct wat de oplossing zou zijn voor ons, maar meer hoe jullie een dergelijke situatie in zouden richten / op zouden zetten. Wat voor database structuur? Design patterns? Server instellingen?
Elke hulp is welkom!
edit:
Omdat er om meer achtergrondinformatie gevraagd werd:
Het betreft een Magento webshop.
Onze huidige oplossing is als volgt:
Een klant van ons heeft een webshop met 500.000+ producten. Op zich niets vreemds, maar er zitten een aantal haken en ogen aan:
- Onze klant werkt met meerdere toeleveranciers. Het kan daardoor dus voorkomen dat leveranciers overlap hebben in het productassortiment. In dat geval moet de prijs van de goedkoopste leverancier gebruikt worden bij het sorteren.
- De klanten van onze klant (organisaties) hebben ook een unieke eigenschap: zij krijgen speciaal toegespitste korting op bepaalde producten, maar alleen weer bij bepaalde leveranciers. Zo kan het dus zijn dat voor product X organisatie A goedkoper uit is bij leverancier M, en organisatie B voor hetzelfde product goedkoper uit is bij leverancier N. Hier moet dus ook rekening mee gehouden worden bij het sorteren op prijs.
- Bij producten komen attributen. Deze attributen worden ook uit een externe bron ingeladen (zoiets als ICECAT). Op deze attributen moet dan weer gefilterd kunnen worden. Voetnoot: het gaat hierbij dus al snel over 20.000+ verschillende attributen in totaal.
Het wonderbaarlijke is dat we dit momenteel al werkend hebben, alleen we lopen tegen een probleem aan: het is tergend traag. Een simpel overzicht laden kan soms al 15 seconden duren. De meest voor de hand liggende optimalisaties zijn al gedaan: denk aan indexeren van kortingsprijzen, indexen op tabellen, etc.
De hosting is bij Amazon. 8 cores, 15 GB ram.
Mijn vraag is niet direct wat de oplossing zou zijn voor ons, maar meer hoe jullie een dergelijke situatie in zouden richten / op zouden zetten. Wat voor database structuur? Design patterns? Server instellingen?
Elke hulp is welkom!
edit:
Omdat er om meer achtergrondinformatie gevraagd werd:
Het betreft een Magento webshop.
Onze huidige oplossing is als volgt:
- We hebben een tweede database met alle attributen / values en product ID's. Het doel van deze database is louter het koppelen van attributen / waarden aan producten. Deze database wordt gevoed vanuit externe bronnen voor productverrijking (2ba, ICECAT, custom dingetjes, etc). Het resultaat is één grote bak waarmee we adhv een EAN-code alle beschikbare productinformatie uit kunnen lezen.
- De kortingsregels worden opgeslagen in de database en de juiste kortingen worden bij mutaties van tevoren berekend en opgeslagen in een geïndexeerde-kortings-prijzen-tabel. Deze tabel geeft per product een prijs aan de hand van de combinatie productID - kortingsregelID - leverancierID. We hebben ook geprobeerd de koppeling te versimpelen door met een combinatie productID - organisatieID te werken, maar dit had exponentionele groei van de tabel tot gevolg (1,5 miljoen records t.o.v. 2.5 miljard records).
- Voor het filteren en sorteren haken we in op Magento en maken een join met de geindexeerde prijs-tabel om te kunnen sorteren op de voorberekende prijs (omdat iedere organisatie een andere prijs voor een product kan hebben), en om te filteren maken we een join met de desbetreffende tabellen in de product-attributen database.
[ Voor 32% gewijzigd door kanduvisla op 08-01-2016 16:34 . Reden: verzoek vanuit reacties ]