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

StageDuration
load-csv370.4s
import-taxonomies7.2s
insert-posts114.2s
insert-postmeta70.5s
upsert-relationships192.5s
upload-remote-images1.0s
fix-attributes328.0s
Total stage time1,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

  1. wp ssi import-taxonomies taxonomies.json
  2. wp ssi create "1M Simple" product simple-products-1m.csv config.json
  3. time wp ssi <id> --workers=4 --performance

Comments

▲
▼
1/1