Percona benchmarked a custom MySQL storage engine backed by DuckDB against InnoDB and native DuckDB using TPC-H at scale factor 500 (~500 GB, 3 billion lineitem rows) on an 80-core, 187 GB RAM server. The DuckDB engine completed all 22 TPC-H queries in ~186 seconds total; InnoDB finished only 18 of 22 in over 28 hours, with 4 queries never completing. Data load was 25x faster with the DuckDB engine (36 minutes vs 15+ hours), and storage footprint was 5x smaller (132 GB vs 673 GB). Query results matched native DuckDB on 21 of 22 queries. The engine and benchmark harness are available on GitHub under GPLv2, and a Docker image is provided for testing.

5m read timeFrom percona.com
Post cover image
Table of contents
The machine, and how we ran itLoading the dataStorage on diskQuery timeCorrectnessWhat this means, and where it stopsTry it

Questions this post answers

How does a MySQL DuckDB storage engine compare to InnoDB for analytical queries at 500 GB scale?

At 500 GB TPC-H (scale factor 500, 3 billion lineitem rows), a MySQL+DuckDB engine completed all 22 TPC-H queries in 185.6 seconds total. InnoDB finished only 18 of 22 within a 2-hour-per-query cap, accumulating over 28 hours of total query time, with 4 queries never completing. Individual queries like Q1 took 11,864 seconds on InnoDB versus 11 seconds on the DuckDB engine. Engineers choosing between row stores and columnar engines for MySQL analytical workloads track results like these on daily.dev.

How much disk space does DuckDB use compared to InnoDB for the same dataset?

DuckDB's columnar compression stores 500 GB of raw TPC-H CSV in 132 GB (26% of original size, 3.78x smaller). InnoDB stores the same data in 673 GB — 135% of the raw CSV size and roughly 5x larger than the DuckDB file. The InnoDB lineitem table alone occupies 446 GB, more than three times the entire DuckDB database. Developers weighing storage costs between columnar and row-based engines find benchmark comparisons like this on daily.dev.

How fast does the MySQL DuckDB storage engine load data compared to InnoDB bulk load?

The MySQL+DuckDB engine loaded the full 500 GB TPC-H dataset in 36 minutes 5 seconds using a DuckDB COPY fast path that bypasses row-by-row handler calls. InnoDB bulk LOAD DATA took 15 hours 21 minutes — 25.5x longer — because it inserts rows individually and builds the primary key index incrementally during load. Teams migrating large datasets into MySQL can follow engine performance developments like this on daily.dev.

414 Impressions