Fastest of four
on COUNT and GROUP BY.
ElyraSQL 0.9.5 benchmarked head-to-head against MySQL 8.4, Percona 8.4 and PostgreSQL 17 — same host, 200,000 rows, each engine measured in isolation (best of 5).
GROUP BY — fastest of all four engines (5.74 ms)
full-scan COUNT of the MySQL family, ties PG
faster GROUP BY vs 0.9.4 (13.3 → 5.74 ms)
bulk insert at scale — ahead of MySQL
GROUP BY, taken to #1
The parallel-split planner used to probe a table's last key with an unbounded range — so full-scan aggregation scaled with total database size, not table size. Bounding the probe to the table's own keyspace made GROUP BY the fastest of the four.
GROUP BY vs 0.9.4 (isolated, 200k rows)
GROUP BY when the file also holds another 200k table + 2 indexes
aggregation is memory-bandwidth bound; capped by default
ElyraSQL vs the field
Milliseconds — lower is better · ElyraSQL wins both
Milliseconds — lower is better (all sub-millisecond)
Sub-0.2 ms differences are virtualisation overhead. Measured natively, ElyraSQL's PK lookup is 0.11 ms — identical to MySQL.
Rows per second — higher is better
LOAD DATA) — ahead of MySQL's ~290k.
ElyraSQL's copy-on-write B-tree is crash-safe without a separate WAL, so tiny (2k-row) autocommit batches flush more than a WAL append would; at bulk-load batch sizes it pulls ahead.
Full results
200,000 rows, each engine isolated, best-of-5 medians. Orange marks where ElyraSQL leads.
| Workload | ElyraSQL 0.9.5 | MySQL 8.4 | Percona 8.4 | PostgreSQL 17 | Verdict |
|---|---|---|---|---|---|
| Full-scan COUNT (no index) | 4.97 ms | 9.06 ms | 10.64 ms | 4.66 ms | Fastest of MySQL family, ties PG |
| GROUP BY (full aggregation) | 5.74 ms | 9.50 ms | 9.93 ms | 6.95 ms | Fastest overall |
| Selective join (index NLJ) | 0.15 ms | 0.11 ms | 0.11 ms | 0.13 ms | Competitive |
| Indexed COUNT | 0.62 ms | 0.28 ms | 0.28 ms | 0.69 ms | Beats PG, behind MySQL |
| Range + ORDER BY pk LIMIT | 0.52 ms | 0.41 ms | 0.41 ms | 0.17 ms | Competitive |
| PK point lookup | 0.17 ms | 0.09 ms | 0.08 ms | 0.11 ms | VM overhead; ties MySQL native |
| Bulk insert · 2k batches (rows/s) | 192,000 | 290,000 | 296,000 | 345,000 | Trails at tiny batches |
| Bulk insert · 50k batches (rows/s) | 351,000 | ~290,000 | — | — | Ahead of MySQL at scale |
The aggregation campaign
Bounded keyspace probe
Full-scan aggregation no longer scales with total database size — the parallel-split planner bounds its last-key probe to the table's own keyspace.
Parallelism capped at 4
Full-scan aggregation is memory-bandwidth bound; beyond ~4 workers coordination overhead made it slower. Override with ELYRASQL_AGG_WORKERS.
Allocation-light grouping
An insertion-ordered map (one key allocation per group) that moves group state during parallel merges instead of cloning — faster high-cardinality GROUP BY.
Buffered wire writes
A 64 KiB buffer coalesces result rows instead of one write_vectored syscall per row — helps any query returning many rows to a fast client.
Same host, same client, same SQL
- All four engines run as containers on one 16-core host (OrbStack), default configuration.
- Each engine is measured alone (the other three paused) so parallel aggregation isn't fighting for cores.
- MySQL / Percona / ElyraSQL use the MySQL wire protocol (PyMySQL); PostgreSQL uses psycopg2.
- 200,000 rows in users(id BIGINT PK, name TEXT, age BIGINT) and a matching orders table.
- Best-of-5 medians; numbers still vary run-to-run by ~10–20%.
# Start the four engines as containers $ docker run -d -p 3307:3307 ghcr.io/kwhorne/elyrasql:0.9.5 $ docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root mysql:8.4 $ docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root \ percona/percona-server:8.4 $ docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres:17 # Run the same schema + SQL against each (measured alone) $ python3 bench/compare.py --driver mysql --port 3307 \ --user root --password '' --label ElyraSQL
Run it yourself.
Download ElyraSQL 0.9.5 and reproduce the numbers on your own hardware.