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:
- Valideer alle attributen via Magento's EAV-systeem
- Laad de bestaande product-entity op
- Schrijf elk attribuut naar de juiste EAV-tabel
- Verwerk category-koppelingen
- Verwerk stock-data
- Trigger Magento events (
catalog_product_save_after, etc.) - 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.
# 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).
| Methode | Duur | Geheugengebruik | Veiligheid |
|---|---|---|---|
| Native import (CSV) | 180 min | 512MB | Hoog |
| Native import (geoptimaliseerd) | 45 min | 256MB | Hoog |
| Magmi | 22 min | 128MB | Medium |
| Custom direct DB | 18 min | 64MB | Laag (vereist expertise) |
| Custom + parallel processing | 6 min | 128MB | Laag (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 schedulebin/magento indexer:set-mode schedule
Dit voorkomt dat elke opgeslagen entiteit een herindexering triggert.
2. Schakel observerlogging uitIn app/etc/env.php:
'system' => [
'default' => [
'dev' => [
'debug' => [
'debug_logging' => 0,
],
],
],
],
php -d memory_limit=2G -d max_execution_time=3600 bin/magento import:data
De native import is het snelst met een CSV die precies de verwachte kolomnamen heeft. Geen lege kolommen, geen overbodige attributen.
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
- 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
// 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();
}
}
# 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
// 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.-- 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();
url_rewrite-tabel miljoenen rijen bevatten.
-- 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;
-- Bekijk lock waits tijdens import
SHOW ENGINE INNODB STATUS\G
Best practices
| Practice | Waarom |
|---|---|
| Indexers op schedule tijdens import | Voorkomt real-time herindexering per product |
| Batch-grootte van 500-2000 per transactie | Balans tussen snelheid en geheugengebruik |
| Staging-omgeving altijd eerst | Valideer zonder productierisico |
| Logging van mislukte rijen | Importeer fouten zijn moeilijk te traceren achteraf |
| Herindexeer altijd na directe DB-import | Flat 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.

Geschreven door Ruthger Idema
15+ jaar ervaring in e-commerce development. Gespecialiseerd in Magento, Shopify en Laravel maatwerk.
Meer over ons team →