Product import optimalisatie — 10x sneller dan de standaard
Terug naar blog

Product import optimalisatie — 10x sneller dan de standaard

AuthorRuthger Idema
16 april 202610 min leestijd

50.000 producten importeren via de native Magento import duurt 3 uur. Met de juiste aanpak duurt het 18 minuten. Wat je anders moet doen en waarom de standaard aanpak zo traag is.

Product import optimalisatie — 10x sneller dan de standaard

50.000 producten importeren via de native Magento 2 import duurt 3 uur op een gemiddelde server. Wij hebben dat teruggebracht naar 18 minuten. Geen magie — een andere aanpak.

Dit artikel legt uit waarom de standaard import zo traag is, wanneer Magmi een optie is en wanneer je beter een custom oplossing bouwt.

Wat je leert in dit artikel

  • Waarom de native Magento import traag is
  • Magmi: voordelen, nadelen en valkuilen
  • Custom import via directe database-operaties
  • Batch processing en geheugenbeheer
  • Praktische tips voor grote catalogi (100k+ producten)

Waarom de native import traag is

De native Magento 2 import (bin/magento import:data of via admin) is functioneel correct maar architectureel traag. Hij doet per product het volgende:

  1. Valideer alle attributen via Magento's EAV-systeem
  2. Laad de bestaande product-entity op
  3. Schrijf elk attribuut naar de juiste EAV-tabel
  4. Verwerk category-koppelingen
  5. Verwerk stock-data
  6. Trigger Magento events (catalog_product_save_after, etc.)
  7. Verwerk URL-rewrites

Stap 6 is het probleem. Event observers draaien voor elk product afzonderlijk. Als je 20 actieve observers hebt — en een gemiddelde Magento-installatie heeft er meer — doe je 20 × 50.000 = 1.000.000 observercalls voor een import van 50.000 producten.

bash
# Meten hoeveel observers actief zijn
bin/magento dev:query-log:enable
# Importeer één product en bekijk het log
tail -f var/log/db.log | grep observer
bin/magento dev:query-log:disable

Benchmarks: native vs. alternatieven

Gemeten op een server met 8 vCPU, 32GB RAM, SSD-opslag. Catalogus: 50.000 eenvoudige producten (10 attributen per product).

MethodeDuurGeheugengebruikVeiligheid
Native import (CSV)180 min512MBHoog
Native import (geoptimaliseerd)45 min256MBHoog
Magmi22 min128MBMedium
Custom direct DB18 min64MBLaag (vereist expertise)
Custom + parallel processing6 min128MBLaag (vereist expertise)

"Veiligheid" betekent hier: de kans dat Magento in een inconsistente staat terechtkomt na de import.

De native import optimaliseren

Voordat je naar alternatieven grijpt, zijn er optimalisaties op de native import:

1. Zet indexers op schedule
bash
bin/magento indexer:set-mode schedule

Dit voorkomt dat elke opgeslagen entiteit een herindexering triggert.

2. Schakel observerlogging uit

In app/etc/env.php:

php
'system' => [
    'default' => [
        'dev' => [
            'debug' => [
                'debug_logging' => 0,
            ],
        ],
    ],
],
3. Vergroot de PHP-limieten
bash
php -d memory_limit=2G -d max_execution_time=3600 bin/magento import:data
4. Gebruik de juiste CSV-structuur

De native import is het snelst met een CSV die precies de verwachte kolomnamen heeft. Geen lege kolommen, geen overbodige attributen.

csv
sku,name,price,status,visibility,attribute_set_code,product_type,categories
SKU-001,Productnaam,29.95,1,4,Default,simple,Categorie 1

Magmi: wanneer gebruiken

Magmi is een open-source tool specifiek gebouwd voor snelle Magento-imports. Hij schrijft data direct naar de database en bypassed Magento's ORM-laag volledig.

Voordelen:
  • 5-10x sneller dan de native import
  • Lage geheugenvoetafdruk
  • Ondersteunt delta-imports (alleen gewijzigde producten)
  • Goede logging
Nadelen:
  • Niet meer actief onderhouden (laatste update 2019)
  • Geen officiële Magento 2.4.x ondersteuning
  • Bypassed validatielogica — foute data gaat er gewoon in
  • Geen ondersteuning voor complexe producttypen (configurable, bundle)

Magmi is een goede keuze als je een stabiele catalogus hebt van eenvoudige producten en je Magento-versie ondersteund wordt. Voor nieuwe projecten adviseren wij het niet meer.

Custom import: de directe aanpak

Voor grote catalogi met specifieke eisen is een custom import de beste optie. De kern is direct schrijven naar de Magento-databasetabellen zonder de Magento-applicatielaag.

php
<?php
// Voorbeeld van een directe product-insert
// LET OP: dit vereist grondige kennis van Magento's datamodel

class DirectProductImporter
{
    private \PDO $pdo;
    private int $batchSize = 1000;

    public function importProducts(array $products): void
    {
        // Stap 1: Schakel indexers tijdelijk uit
        $this->disableIndexers();

        // Stap 2: Verwerk in batches
        foreach (array_chunk($products, $this->batchSize) as $batch) {
            $this->processBatch($batch);

            // Geheugen vrijgeven
            gc_collect_cycles();
        }

        // Stap 3: Herindexeer alles in één keer
        $this->reindexAll();
    }

    private function processBatch(array $batch): void
    {
        $this->pdo->beginTransaction();

        try {
            foreach ($batch as $product) {
                // Schrijf naar catalog_product_entity
                $entityId = $this->insertEntity($product);

                // Schrijf attributen naar EAV-tabellen
                $this->insertVarcharAttributes($entityId, $product);
                $this->insertDecimalAttributes($entityId, $product);
                $this->insertIntAttributes($entityId, $product);

                // Schrijf voorraad
                $this->insertStock($entityId, $product);

                // Schrijf categorie-koppelingen
                $this->insertCategoryLinks($entityId, $product);
            }

            $this->pdo->commit();
        } catch (\Exception $e) {
            $this->pdo->rollBack();
            throw $e;
        }
    }

    private function insertEntity(array $product): int
    {
        $stmt = $this->pdo->prepare(
            'INSERT INTO catalog_product_entity
             (attribute_set_id, type_id, sku, created_at, updated_at)
             VALUES (:attribute_set_id, :type_id, :sku, NOW(), NOW())
             ON DUPLICATE KEY UPDATE updated_at = NOW()'
        );

        $stmt->execute([
            ':attribute_set_id' => $product['attribute_set_id'],
            ':type_id' => $product['type_id'] ?? 'simple',
            ':sku' => $product['sku'],
        ]);

        return (int) $this->pdo->lastInsertId();
    }
}
Belangrijk: een directe DB-import vereist dat je achteraf opschoont:
bash
# Na een directe DB-import altijd uitvoeren
bin/magento indexer:reindex
bin/magento cache:flush
bin/magento setup:upgrade  # Als er nieuwe URL-rewrites nodig zijn

Parallel processing voor grote catalogi

Bij 500.000+ producten is ook batch-processing te traag. De oplossing is parallelisme: verdeel de catalogus in segmenten en verwerk elk segment in een apart proces.

php
<?php
// CLI-commando dat parallel wordt uitgevoerd
class ParallelImportCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $totalProducts = $this->getTotalProductCount();
        $segmentSize = 10000;
        $segments = ceil($totalProducts / $segmentSize);

        $processes = [];

        for ($i = 0; $i < $segments; $i++) {
            $offset = $i * $segmentSize;

            // Start elk segment als een apart PHP-proces
            $process = new Process([
                'php', 'bin/magento',
                'import:segment',
                '--offset=' . $offset,
                '--limit=' . $segmentSize,
            ]);

            $process->start();
            $processes[] = $process;

            // Maximaal 4 processen tegelijk (aanpassen aan server-capaciteit)
            if (count($processes) >= 4) {
                $this->waitForProcesses($processes);
                $processes = [];
            }
        }

        // Wacht op resterende processen
        $this->waitForProcesses($processes);

        // Eenmalige herindexering na alles
        $this->runReindex();

        return Command::SUCCESS;
    }
}

Met 4 parallelle processen op een 8-core server importeer je 500.000 producten in 25-30 minuten in plaats van 3-4 uur.

Tips voor grote catalogi

Gebruik staging tables. Schrijf import-data eerst naar tijdelijke tabellen, valideer ze en kopieer ze dan naar de productietabellen in één transactie.
sql
-- Tijdelijke tabel voor staging
CREATE TEMPORARY TABLE import_staging LIKE catalog_product_entity;

-- Na validatie: kopieer naar productietabel
INSERT INTO catalog_product_entity
SELECT * FROM import_staging
ON DUPLICATE KEY UPDATE updated_at = NOW();
Verwijder dubbele URL-rewrites vóór import. Magento maakt bij elke import nieuwe URL-rewrites. Na jaren importeren kan de url_rewrite-tabel miljoenen rijen bevatten.
sql
-- Tel URL-rewrites
SELECT COUNT(*) FROM url_rewrite;

-- Verwijder dubbele rewrites (voorzichtig: test eerst op staging)
DELETE ur1 FROM url_rewrite ur1
INNER JOIN url_rewrite ur2
WHERE ur1.url_rewrite_id < ur2.url_rewrite_id
AND ur1.request_path = ur2.request_path;
Monitor MySQL tijdens de import. Een import die vastloopt door lock waits is erger dan een trage import.
sql
-- Bekijk lock waits tijdens import
SHOW ENGINE INNODB STATUS\G

Best practices

PracticeWaarom
Indexers op schedule tijdens importVoorkomt real-time herindexering per product
Batch-grootte van 500-2000 per transactieBalans tussen snelheid en geheugengebruik
Staging-omgeving altijd eerstValideer zonder productierisico
Logging van mislukte rijenImporteer fouten zijn moeilijk te traceren achteraf
Herindexeer altijd na directe DB-importFlat tables en search index zijn anders verouderd

Conclusie

De native Magento import is correct maar niet gebouwd voor snelheid. Voor catalogi groter dan 10.000 producten loont het om te onderzoeken of een alternatieve aanpak past bij je situatie.

Magmi is werkend maar verouderd. Een custom directe import is het snelst, maar vereist grondige kennis van Magento's datamodel. Het risico op inconsistente data is reëel als je het niet goed doet.

Lees ook Magento 2 performance voor grote catalogi voor meer context. Meer weten over onze Magento-aanpak? Bekijk onze Magento-pagina. Overweeg een PIM-systeem naast Magento als je regelmatig grote importbatches verwerkt.


Wil je een snelle, betrouwbare import-oplossing voor jouw catalogus? Neem contact op — wij bouwen het maatwerk dat past bij jouw situatie.
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