SQL / Server / Benchmark
Cross-engine benchmark · v0.9.5

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).

#1

GROUP BY — fastest of all four engines (5.74 ms)

#1

full-scan COUNT of the MySQL family, ties PG

~2.3×

faster GROUP BY vs 0.9.4 (13.3 → 5.74 ms)

351k/s

bulk insert at scale — ahead of MySQL

Honesty note. These are reproducible numbers on developer hardware (all four engines as containers on one 16-core host, each measured alone), not a tuned, vendor-official benchmark. Treat them as relative — the shape is the point, and it's reproducible with the harness below.
The 0.9.5 aggregation campaign

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.

13.3 → 5.74 ms

GROUP BY vs 0.9.4 (isolated, 200k rows)

~17 → 4.4 ms

GROUP BY when the file also holds another 200k table + 2 indexes

4 workers

aggregation is memory-bandwidth bound; capped by default

Head to head · 200,000 rows · each engine isolated

ElyraSQL vs the field

ElyraSQL 0.9.5 MySQL 8.4 Percona 8.4 PostgreSQL 17
Heavy scans & aggregation

Milliseconds — lower is better · ElyraSQL wins both

Full-scan COUNT (no index)
ElyraSQL
4.97 ms
MySQL
9.06 ms
Percona
10.64 ms
PostgreSQL
4.66 ms
GROUP BY (full aggregation)
ElyraSQL
5.74 ms
MySQL
9.5 ms
Percona
9.93 ms
PostgreSQL
6.95 ms
Indexed & point queries

Milliseconds — lower is better (all sub-millisecond)

Indexed COUNT
ElyraSQL
0.62 ms
MySQL
0.28 ms
Percona
0.28 ms
PostgreSQL
0.69 ms
Range + ORDER BY pk LIMIT
ElyraSQL
0.52 ms
MySQL
0.41 ms
Percona
0.41 ms
PostgreSQL
0.17 ms
Selective join (index NLJ)
ElyraSQL
0.15 ms
MySQL
0.11 ms
Percona
0.11 ms
PostgreSQL
0.13 ms
PK point lookup
ElyraSQL
0.17 ms
MySQL
0.09 ms
Percona
0.08 ms
PostgreSQL
0.11 ms

Sub-0.2 ms differences are virtualisation overhead. Measured natively, ElyraSQL's PK lookup is 0.11 ms — identical to MySQL.

Bulk insert throughput

Rows per second — higher is better

2k-row batches
ElyraSQL
192k
MySQL
290k
Percona
296k
PostgreSQL
345k
351k rows/s at realistic ≥10k-row batches (or 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
What changed in 0.9.5

The aggregation campaign

01

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.

02

Parallelism capped at 4

Full-scan aggregation is memory-bandwidth bound; beyond ~4 workers coordination overhead made it slower. Override with ELYRASQL_AGG_WORKERS.

03

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.

04

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.

Method

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%.
reproduce the benchmark
# 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.