1,000,000 Simple Products (Pro)
Dave Hilditch
•
Super Speedy Imports Pro imported 1,000,000 simple WooCommerce products in 22 minutes 30 seconds on a modest 4-vCPU server, with external (colour-matched) images, five attributes and around 10 million term relationships, at a flat ~128 MB of memory. That is about 22 minutes for a million products on a small box; the single-worker wp.org edition took 87m 07s for the same file (see the Pro vs Lite comparison).
Summary
- Result: 1,000,000 products in 22m 30s wall clock (18m 23s of import-stage time), ~907 products/sec through the stages.
- Memory: flat ~128 MB across the whole run. Bulk-SQL, not row-by-row, so a million rows does not balloon memory.
- Images: external URLs, served with our External Images plugin rather than downloaded, so this result has no image-download caveat. The images still display on every product, which makes External Images ideal for affiliate and dropship stores that serve images straight from supplier URLs.
- Free is just as fast: the free Lite edition ran the same import in 21m 28s. See the Pro vs Lite comparison.
Per-stage breakdown
| Stage | Duration |
|---|---|
| load-csv | 370.4s |
| import-taxonomies | 7.2s |
| insert-posts | 114.2s |
| insert-postmeta | 70.5s |
| upsert-relationships | 192.5s |
| upload-remote-images | 1.0s |
| fix-attributes | 328.0s |
| Total stage time | 1,102.7s |
Wall clock (1,350s) is stage time plus ~247s of worker orchestration and WooCommerce post-import housekeeping.
Key findings
- Two stages dominate: load-csv (370s, staging a million rows each carrying eight taxonomies) and fix-attributes (328s, wiring WooCommerce’s five global attributes across a million products). Everything else is a rounding error by comparison.
- fix-attributes is the optimisation target. It is the second-biggest stage and the most engine-sensitive; it is where a million-product import time can most be reduced.
- Memory stays flat. The set-based INSERT … SELECT design keeps peak memory at ~128 MB regardless of row count.
Methodology
- Server: Hetzner cloud, 4 vCPU, 7.6 GB RAM, PHP 8.2, MariaDB 10.11, WooCommerce, WordPress. MariaDB temp files on disk.
- Plugin: Super Speedy Imports 2.73 Pro,
--workers=4 --performance. - Baseline: clean cold start (0 products, 0 terms) restored from a snapshot. One run (indicative, not averaged).
Dataset
- Products: 1,000,000 simple WooCommerce products.
- Taxonomies and attributes: hierarchical category, brand, tags, plus five attributes (colour, size, material, pattern, style). About 10 terms per product, ~10 million term relationships.
- Images: external, colour-matched, served via External Images (not downloaded).
Reproduce
- Dataset (311 MB CSV): simple-products-1m.csv
- Config and taxonomies: the
simple-products-1mfolder in the super-speedy-imports-demo-data repo.
wp ssi import-taxonomies taxonomies.jsonwp ssi create "1M Simple" product simple-products-1m.csv config.jsontime wp ssi <id> --workers=4 --performance

Comments