Catalogus met 100.000+ producten — Magento performance aanpak
Terug naar blog

Catalogus met 100.000+ producten — Magento performance aanpak

AuthorRuthger Idema
9 april 202612 min leestijd

100.000 producten in Magento is geen technisch probleem zolang je de architectuur goed inricht. Flat tables, indexing strategie, ElasticSearch-configuratie — dit zijn de knoppen waar je aan draait.

Catalogus met 100.000+ producten — Magento performance aanpak

100.000 producten in Magento is niet het probleem. Het probleem is 100.000 producten in Magento zonder de juiste indexing-strategie, zonder ElasticSearch-tuning en met een naïeve import-aanpak.

Wij beheren meerdere Magento-installaties met catalogi in dit formaat. Dit zijn de architectuurkeuzes die het verschil maken tussen een shop die laadt in 1,2 seconden en een shop die iedereen frustreert.

Wat je leert in dit artikel

  • Hoe Magento's indexing-architectuur werkt bij grote catalogi
  • Flat tables: wanneer ze helpen en wanneer niet
  • ElasticSearch-configuratie voor grote catalogi
  • Import-optimalisatie voor bulk-operaties
  • Caching strategie voor hoge SKU-aantallen

Indexing begrijpen bij grote catalogi

Magento heeft meerdere indexers. Bij grote catalogi zijn dit de meest kritieke:

IndexerFunctieImpact grote catalogus
catalog_product_priceBerekent prijzen inclusief kortingenZwaar: herberekent per product
catalogsearch_fulltextElasticSearch index opbouwenZeer zwaar bij 100K+
catalog_category_productKoppelt producten aan categorieënZwaar bij diepe categoriestructuren
catalogrule_ruleCatalogusprijsregels toepassenKan uren duren bij grote aantallen

Indexeringsmodus: realtime vs gepland

Magento kent twee indexeringsmodi: "Update on Save" (realtime) en "Update by Schedule" (gepland).

Voor catalogi boven de 10.000 producten: zet alle indexers op "Update by Schedule". Realtime indexering bij elke productwijziging kost te veel tijd en blokkeert de admin.

bash
# Zet alle indexers op scheduled
php bin/magento indexer:set-mode schedule

# Of per indexer
php bin/magento indexer:set-mode schedule catalog_product_price catalogsearch_fulltext

# Bekijk de huidige modus
php bin/magento indexer:info

Gedeeltelijke reindex

Bij "Update by Schedule" legt Magento een changelog bij: welke producten zijn gewijzigd. Alleen die producten worden bij de volgende cron-run herindexeerd. Dit is een reductie van uren naar minuten bij grote catalogi.

sql
-- Bekijk de changelog-tabel voor prijsindexer
SELECT COUNT(*) FROM catalog_product_price_cl;

-- Hoeveel versies wachten op verwerking
SELECT MAX(version_id) FROM catalog_product_price_cl;
SELECT version_id FROM indexer_state WHERE indexer_id = 'catalog_product_price';

Als de changelog-tabel honderdduizenden rijen bevat zonder verwerkt te worden, is je cron-configuratie incorrect.

Flat tables

Flat tables zijn een Magento-mechanisme waarbij product- en categoriedata wordt gedenormaliseerd naar één tabel per store view. Dit reduceert JOIN-queries op de frontend.

bash
# Flat tables inschakelen
php bin/magento config:set catalog/frontend/flat_catalog_product 1
php bin/magento config:set catalog/frontend/flat_catalog_category 1
php bin/magento indexer:reindex catalog_product_flat catalog_category_flat
Wanneer flat tables helpen: catalogi tot 50.000 producten, weinig attributes, weinig store views. Wanneer flat tables niet helpen: bij meer dan 100.000 producten duurt het herbouwen van de flat tabel langer dan de tijdsbesparing oplevert. Bij veel custom attributes worden flat tables ook groter dan de EAV-tabellen die ze vervangen.

Wij zien in de praktijk dat ElasticSearch flat tables grotendeels overbodig maakt voor zoek- en categoriepagina's. De meeste frontend-weergave gaat via de ElasticSearch index, niet via de catalog-tabellen.

ElasticSearch-configuratie

ElasticSearch is bij grote catalogi niet optioneel — het is de reden dat Magento überhaupt schaalbaar is op het gebied van zoeken.

Index-instellingen tunen

json
// elasticsearch.json configuratie voor grote catalogus
{
  "index": {
    "number_of_shards": 5,
    "number_of_replicas": 1,
    "refresh_interval": "30s",
    "max_result_window": 500000
  },
  "analysis": {
    "analyzer": {
      "dutch_analyzer": {
        "type": "standard",
        "stopwords": "_dutch_"
      }
    }
  }
}
refresh_interval op 30 seconden in plaats van de standaard 1 seconde. Dit vermindert de indexeer-last significant bij bulk-imports. Producten zijn dan tot 30 seconden later zichtbaar in zoekresultaten — acceptabel voor de meeste shops. max_result_window verhogen is nodig als je meer dan 10.000 producten in één categorie hebt. Zonder deze instelling geeft ElasticSearch een fout bij diep pagineren.

Batch-indexering

Bij een volledige reindex van 100.000+ producten is batchgrootte bepalend voor de duur.

php
// In app/etc/env.php
'system' => [
    'default' => [
        'catalog' => [
            'search' => [
                'elasticsearch7_index_prefix' => 'magento2',
                'elasticsearch_batch_size' => 1000,
            ]
        ]
    ]
]

Een batchgrootte van 1.000 is een goed startpunt. Groter verhoogt het geheugengebruik per batch. Kleiner verlengt de totale duur door meer HTTP-verzoeken naar ElasticSearch.

Import-optimalisatie

Bij grote catalogi is importsnelheid een operationeel vraagstuk. Als een nachtelijke productimport acht uur duurt, heb je overdag verouderde data.

Magento's native import

bash
# Import via CLI met profiling
time php bin/magento import:validate --entity=catalog_product --behavior=append import.csv
time php bin/magento import:run --entity=catalog_product --behavior=append import.csv

# Import met meer geheugen
php -d memory_limit=4G bin/magento import:run --entity=catalog_product import.csv

Native import verwerkt gemiddeld 500-2.000 producten per minuut, afhankelijk van het aantal attributes en de serverspecificaties.

Optimalisaties voor import

Schakel indexers uit tijdens import en herindexeer daarna:

bash
# Zet indexers op "manual" mode tijdens import
php bin/magento indexer:set-mode schedule
# Stel indexers in op idle (worden niet automatisch getriggerd)
php bin/magento indexer:reset

# Importeer
php bin/magento import:run --entity=catalog_product products.csv

# Herindexeer daarna
php bin/magento indexer:reindex

Disable FPC en block cache tijdens import:

bash
php bin/magento cache:disable full_page block_html
# Importeer
php bin/magento import:run --entity=catalog_product products.csv
# Flush en heractiveer cache
php bin/magento cache:enable full_page block_html
php bin/magento cache:flush full_page block_html

Custom import voor hoge volumes

Bij 200.000+ producten per import-run is native import vaak te traag. Directe database-inserts via een custom import-script zijn 5-10x sneller, maar vereisen dat je de Magento-datastructuur begrijpt.

php
// Directe insert in EAV-tabel (vereist grondige kennis van Magento datamodel)
$connection = $this->resourceConnection->getConnection();

$rows = [];
foreach ($products as $product) {
    $rows[] = [
        'entity_id' => $product['entity_id'],
        'attribute_id' => $nameAttributeId,
        'store_id' => 0,
        'value' => $product['name'],
    ];
}

// Batch insert
$connection->insertOnDuplicate(
    $connection->getTableName('catalog_product_entity_varchar'),
    $rows,
    ['value']
);

Dit is krachtig maar gevaarlijk. Eén fout in de datastructuur corrumpeert producten. Doe dit alleen met uitgebreide tests en een rollback-strategie.

Caching bij grote catalogi

Full Page Cache strategie

Bij 100.000+ producten is volledige FPC-coverage niet realistisch. Niet elk product wordt dagelijks bezocht. Prioriteer caching op:

  • Categoriepagina's (hoogste traffic)
  • Populaire productpagina's (top 20% van views)
  • Zoekresultatenpagina's voor populaire queries

Varnish TTL per pagina-type

vcl
// Varnish configuratie: hogere TTL voor categoriepagina's
sub vcl_backend_response {
    if (req.url ~ "^/[a-z]+-category\.html") {
        set beresp.ttl = 3600s; // 1 uur voor categoriepagina's
    }
    if (req.url ~ "^/[a-z]+-product\.html") {
        set beresp.ttl = 1800s; // 30 minuten voor productpagina's
    }
}

Redis voor product-data caching

php
// Cache producdata per product-id met TTL
$cacheKey = 'product_data_' . $productId . '_' . $storeId;
$cached = $this->cache->load($cacheKey);

if (!$cached) {
    $product = $this->productRepository->getById($productId);
    $data = $this->prepareProductData($product);
    $this->cache->save(
        serialize($data),
        $cacheKey,
        ['catalog_product_' . $productId],
        3600
    );
    return $data;
}

return unserialize($cached);

Veelgemaakte fouten

1. Realtime indexering aan laten staan bij grote catalogi

Elke productopslag triggert een volledige reindex. Bij 100.000 producten duurt dat minuten. De admin-beheerder wacht. Zet alle indexers op "Update by Schedule".

2. ElasticSearch reindex uitvoeren tijdens kantooruren

Een volledige catalogus-reindex van 100.000 producten legt voor 20-40 minuten extra load op de server. Plan dit 's nachts.

3. Alle attributen als "Searchable" markeren

Elk searchable attribute vergroot de ElasticSearch index en vertraagt indexering. Markeer alleen attributes als searchable als klanten er daadwerkelijk op zoeken.

4. Import-CSV zonder batchsplitsing

Een CSV van 500.000 regels in één keer importeren overbelast het geheugen. Splits op in batches van 10.000-50.000 regels en importeer sequentieel.

Conclusie

Een Magento-catalogus met 100.000+ producten vereist bewuste keuzes op het gebied van indexing, ElasticSearch-configuratie en importstrategie. De standaardconfiguratie is niet voldoende.

De meeste performance-problemen bij grote catalogi zijn configuratieproblemen, geen hardwareproblemen. Schaling helpt, maar de juiste instellingen helpen meer en kosten minder.

Wij helpen bij de architectuur en optimalisatie van grote Magento-catalogi. Bekijk onze Magento diensten of neem contact op voor een vrijblijvend gesprek. Voor geoptimaliseerde hosting bij grote catalogi is Hypernode een bewezen keuze.


Meer over database-optimalisatie in Magento 2? Lees Magento 2 database optimalisatie.
Ruthger Idema

Geschreven door Ruthger Idema

15+ jaar ervaring in e-commerce development. Gespecialiseerd in Magento, Shopify en Laravel maatwerk.

Meer over ons team →
Deel dit artikel:

Wil je jouw e-commerce naar het volgende niveau?

Plan een vrijblijvend gesprek met onze experts over Magento, Shopify of Laravel maatwerk.

Plan een Tech Check