Small Restaurant Site SQLite Benchmark

Local macOS production-methodology request-load comparison for a small restaurant WordPress site: 10 pages, 6 blog posts, comments, reservation-request writes, and wp-admin editor/admin paths. Negative latency deltas mean SQLite was faster; positive throughput deltas mean SQLite completed more work.

3repetitions per workload/concurrent-request cell
4, 16, 32, 64concurrent requests tested
0SQLite WAL PR #405 + LALR PR #429 failed benchmark flows
0SQLite WAL PR #405 + LALR PR #429 lock/busy log events
68,566SQLite PHP warning/database-error log events across measured rows

This is a local diagnostic, not the blocked dedicated-Linux full matrix. The measured window starts after fixture restore, server startup, login setup, and warm-up.

Headline Result

When the LALR parser is actually wired into the request-time SQLite driver path, SQLite WAL+LALR is slower than MySQL 8.4 InnoDB in every workload and concurrent-request cell in this small restaurant benchmark.

How The Test Was Conducted

  1. Create the same small restaurant WordPress fixture for MySQL 8.4 InnoDB and SQLite: homepage, menu, reservations, contact, about, event/catering/gallery/location/journal pages, six posts, seed comments, seed reservations, and benchmark users.
  2. Before every measured cell, restore that variant's clean database snapshot so previous writes do not affect the next run.
  3. Start local nginx and PHP-FPM for the case, log in worker admin sessions outside the measured timing window, and run a warm-up for 5.0 seconds.
  4. Measure for 20.0 seconds with the configured concurrent-request count.
  5. Read-heavy flow mix: public page/menu/search/REST reads plus a small amount of logged-in wp-admin reads.
  6. Balanced and write-heavy mixes add verified comment writes, public reservation-request writes, and authenticated editor-save simulations.
  7. Record full-flow latency, average request completion time, throughput, write throughput, failures, write verification, SQLite WAL size, and SQLite lock/busy logs.

SQLite WAL PR #405 + LALR PR #429 vs MySQL 8.4 InnoDB Delta Heatmaps

Throughput deltaThroughput deltaSQLite WAL PR #405 + LALR PR #429 vs MySQL 8.4 InnoDB. Green is better for SQLite; red is worse.4163264read-heavy-83.2%SQLite WAL PR #405 + LALR PR #429 16.32-32.7%SQLite WAL PR #405 + LALR PR #429 60.99-27.7%SQLite WAL PR #405 + LALR PR #429 70.94-24.7%SQLite WAL PR #405 + LALR PR #429 70.60balanced-89.3%SQLite WAL PR #405 + LALR PR #429 11.00-62.7%SQLite WAL PR #405 + LALR PR #429 35.68-37.6%SQLite WAL PR #405 + LALR PR #429 59.47-33.3%SQLite WAL PR #405 + LALR PR #429 66.71write-heavy-94.5%SQLite WAL PR #405 + LALR PR #429 5.86-74.8%SQLite WAL PR #405 + LALR PR #429 25.47-50.2%SQLite WAL PR #405 + LALR PR #429 50.63-40.9%SQLite WAL PR #405 + LALR PR #429 58.30
Average request-time deltaAverage request-time deltaSQLite WAL PR #405 + LALR PR #429 vs MySQL 8.4 InnoDB. Green is better for SQLite; red is worse.4163264read-heavy+462.9%SQLite WAL PR #405 + LALR PR #429 144.24+41.7%SQLite WAL PR #405 + LALR PR #429 148.06+31.1%SQLite WAL PR #405 + LALR PR #429 268.16+27.3%SQLite WAL PR #405 + LALR PR #429 519.27balanced+774.8%SQLite WAL PR #405 + LALR PR #429 221.86+145.5%SQLite WAL PR #405 + LALR PR #429 258.89+53.1%SQLite WAL PR #405 + LALR PR #429 309.32+38.5%SQLite WAL PR #405 + LALR PR #429 549.25write-heavy+1680.4%SQLite WAL PR #405 + LALR PR #429 473.63+279.7%SQLite WAL PR #405 + LALR PR #429 432.35+86.5%SQLite WAL PR #405 + LALR PR #429 421.55+43.2%SQLite WAL PR #405 + LALR PR #429 680.43
p95 full-flow latency deltap95 full-flow latency deltaSQLite WAL PR #405 + LALR PR #429 vs MySQL 8.4 InnoDB. Green is better for SQLite; red is worse.4163264read-heavy+1948.5%SQLite WAL PR #405 + LALR PR #429 1,926.05+275.5%SQLite WAL PR #405 + LALR PR #429 1,937.09+117.3%SQLite WAL PR #405 + LALR PR #429 1,998.89+24.1%SQLite WAL PR #405 + LALR PR #429 2,397.54balanced+1927.9%SQLite WAL PR #405 + LALR PR #429 1,959.16+278.0%SQLite WAL PR #405 + LALR PR #429 1,978.11+92.6%SQLite WAL PR #405 + LALR PR #429 2,044.88+49.2%SQLite WAL PR #405 + LALR PR #429 2,591.44write-heavy+1924.5%SQLite WAL PR #405 + LALR PR #429 1,984.35+300.3%SQLite WAL PR #405 + LALR PR #429 2,006.26+104.6%SQLite WAL PR #405 + LALR PR #429 2,041.41+48.6%SQLite WAL PR #405 + LALR PR #429 2,651.25
Verified writes/sec deltaVerified writes/sec deltaSQLite WAL PR #405 + LALR PR #429 vs MySQL 8.4 InnoDB. Green is better for SQLite; red is worse.4163264read-heavyn/aSQLite WAL PR #405 + LALR PR #429 0.00n/aSQLite WAL PR #405 + LALR PR #429 0.00n/aSQLite WAL PR #405 + LALR PR #429 0.00n/aSQLite WAL PR #405 + LALR PR #429 0.00balanced-87.1%SQLite WAL PR #405 + LALR PR #429 2.70-59.0%SQLite WAL PR #405 + LALR PR #429 7.95-35.3%SQLite WAL PR #405 + LALR PR #429 12.32-35.5%SQLite WAL PR #405 + LALR PR #429 13.78write-heavy-94.9%SQLite WAL PR #405 + LALR PR #429 1.63-75.4%SQLite WAL PR #405 + LALR PR #429 7.27-49.3%SQLite WAL PR #405 + LALR PR #429 15.67-41.6%SQLite WAL PR #405 + LALR PR #429 17.45

Throughput And Tail Latency

Throughput vs p95 latencyThroughput vs p95 latencyEach point is a median cell. Better points move right and down.MySQL 8.4 InnoDB balanced c4: 102.55 flows/s, p95 97ms4MySQL 8.4 InnoDB balanced c16: 95.57 flows/s, p95 523ms16MySQL 8.4 InnoDB balanced c32: 95.26 flows/s, p95 1.06s32MySQL 8.4 InnoDB balanced c64: 100.03 flows/s, p95 1.74s64MySQL 8.4 InnoDB read-heavy c4: 97.42 flows/s, p95 94ms4MySQL 8.4 InnoDB read-heavy c16: 90.62 flows/s, p95 516ms16MySQL 8.4 InnoDB read-heavy c32: 98.09 flows/s, p95 920ms32MySQL 8.4 InnoDB read-heavy c64: 93.76 flows/s, p95 1.93s64MySQL 8.4 InnoDB write-heavy c4: 106.20 flows/s, p95 98ms4MySQL 8.4 InnoDB write-heavy c16: 101.01 flows/s, p95 501ms16MySQL 8.4 InnoDB write-heavy c32: 101.73 flows/s, p95 998ms32MySQL 8.4 InnoDB write-heavy c64: 98.61 flows/s, p95 1.78s64SQLite WAL PR #405 + LALR PR #429 balanced c4: 11.00 flows/s, p95 1.96s4SQLite WAL PR #405 + LALR PR #429 balanced c16: 35.68 flows/s, p95 1.98s16SQLite WAL PR #405 + LALR PR #429 balanced c32: 59.47 flows/s, p95 2.04s32SQLite WAL PR #405 + LALR PR #429 balanced c64: 66.71 flows/s, p95 2.59s64SQLite WAL PR #405 + LALR PR #429 read-heavy c4: 16.32 flows/s, p95 1.93s4SQLite WAL PR #405 + LALR PR #429 read-heavy c16: 60.99 flows/s, p95 1.94s16SQLite WAL PR #405 + LALR PR #429 read-heavy c32: 70.94 flows/s, p95 2.00s32SQLite WAL PR #405 + LALR PR #429 read-heavy c64: 70.60 flows/s, p95 2.40s64SQLite WAL PR #405 + LALR PR #429 write-heavy c4: 5.86 flows/s, p95 1.98s4SQLite WAL PR #405 + LALR PR #429 write-heavy c16: 25.47 flows/s, p95 2.01s16SQLite WAL PR #405 + LALR PR #429 write-heavy c32: 50.63 flows/s, p95 2.04s32SQLite WAL PR #405 + LALR PR #429 write-heavy c64: 58.30 flows/s, p95 2.65s64MySQL 8.4 InnoDBSQLite WAL PR #405 + LALR PR #429Completed flows per secondp95 full-flow latency

Aggregate Table

VariantWorkloadConcurrent requestsRepsMedian flows/sAvg request completionp95 flow latencyVerified writes/sFailed flowsWrite verify failuresSQLite lock/busyMax WAL bytes
mariadb-innodb-baselinebalanced43102.5525ms97ms20.910000
mariadb-innodb-baselinebalanced16395.57105ms523ms19.370000
mariadb-innodb-baselinebalanced32395.26202ms1.06s19.040000
mariadb-innodb-baselinebalanced643100.03397ms1.74s21.370000
mariadb-innodb-baselineread-heavy4397.4226ms94ms0.000000
mariadb-innodb-baselineread-heavy16390.62104ms516ms0.000000
mariadb-innodb-baselineread-heavy32398.09205ms920ms0.000000
mariadb-innodb-baselineread-heavy64393.76408ms1.93s0.000000
mariadb-innodb-baselinewrite-heavy43106.2027ms98ms31.610000
mariadb-innodb-baselinewrite-heavy163101.01114ms501ms29.610000
mariadb-innodb-baselinewrite-heavy323101.73226ms998ms30.900000
mariadb-innodb-baselinewrite-heavy64398.61475ms1.78s29.860000
sqlite-wal-pr405-lalr-wiredbalanced4311.00222ms1.96s2.700004152992
sqlite-wal-pr405-lalr-wiredbalanced16335.68259ms1.98s7.950004148872
sqlite-wal-pr405-lalr-wiredbalanced32359.47309ms2.04s12.320004255992
sqlite-wal-pr405-lalr-wiredbalanced64366.71549ms2.59s13.780004602072
sqlite-wal-pr405-lalr-wiredread-heavy4316.32144ms1.93s0.00000123632
sqlite-wal-pr405-lalr-wiredread-heavy16360.99148ms1.94s0.0000070072
sqlite-wal-pr405-lalr-wiredread-heavy32370.94268ms2.00s0.0000074192
sqlite-wal-pr405-lalr-wiredread-heavy64370.60519ms2.40s0.0000065952
sqlite-wal-pr405-lalr-wiredwrite-heavy435.86474ms1.98s1.630002426712
sqlite-wal-pr405-lalr-wiredwrite-heavy16325.47432ms2.01s7.270004173592
sqlite-wal-pr405-lalr-wiredwrite-heavy32350.63422ms2.04s15.670004293072
sqlite-wal-pr405-lalr-wiredwrite-heavy64358.30680ms2.65s17.450004523792