MariaDB 11.8.6 InnoDB & TidesDB (TideSQL v4.2.4) TPC-C Benchmark Analysis

published on April 16th, 2026
Following on the last lower level engine analysis, this analysis is the latest version of TideSQL v4.2.4 and TidesDB v9.0.8 within MariaDB 11.8.6. I am running TPC-C benchmarks utilizing HammerDB.
System specs
- AMD Ryzen Threadripper 2950X (16 cores 32 threads) @ 3.5GHz
- 128GB DDR4
- Ubuntu 22.04 x86_64
- GCC (glibc)
- XFS raw NVMe(SAMSUNG MZVLB512HAJQ-00000) w/discard, inode64, nodiratime, noatime, logbsize=256k, logbufs=8
First run, small buffers/caches at 64mb to see how the engines perform utilizing memory and disk i/o.
For each run I used hammerdb_runner.sh i.e:
./hammerdb_runner.sh -b tpcc --warehouses 40 --tpcc-vu 8 --tpcc-build-vu 8 --rampup 1 --duration 2 --settle 5 -H ~/HammerDB-5.0 -e innodb -u hammerdb --pass hammerdb123 -S /tmp/mariadb.sock
./hammerdb_runner.sh -b tpcc --warehouses 40 --tpcc-vu 8 --tpcc-build-vu 8 --rampup 1 --duration 2 --settle 5 -H ~/HammerDB-5.0 -e tidesdb -u hammerdb --pass hammerdb123 -S /tmp/mariadb.sockThe hammerdb_runner is available here: hammerdb_runner.sh
Click to see MariaDB config
[mysqld]basedir = /data/mariadbdatadir = /data/mariadb/dataport = 3306socket = /tmp/mariadb.sockuser = rootpid-file = /data/mariadb/data/mariadb.pidlog-error = /data/mariadb/data/mariadb.err
# Networkingbind-address = 127.0.0.1max_connections = 1024# thread_handling = pool-of-threads# thread_pool_size = 16table_open_cache=2000table_open_cache_instances=16back_log=1500max_prepared_stmt_count=102400innodb_open_files=1024
sort_buffer_size = 4Mjoin_buffer_size = 4Mread_buffer_size = 2Mread_rnd_buffer_size = 2Mtmp_table_size = 64Mmax_heap_table_size = 64M
skip-log-binsync_binlog = 0
table_open_cache = 4096table_definition_cache = 2048
# InnoDB (inspired by https://hammerdb.com/ci-config/maria.cnf)default_storage_engine = InnoDBinnodb_buffer_pool_size = 64M#innodb_buffer_pool_instances = 4innodb_log_file_size = 24Minnodb_log_buffer_size = 24Minnodb_flush_log_at_trx_commit = 0innodb_file_per_table = ONinnodb_doublewrite = 0innodb_flush_method = O_DIRECTinnodb_io_capacity = 10000innodb_io_capacity_max = 20000innodb_purge_threads = 4innodb_max_purge_lag_wait=0innodb_max_purge_lag=0innodb_max_purge_lag_delay=1innodb_lru_scan_depth=128innodb_read_only=0innodb_adaptive_hash_index=0innodb_undo_log_truncate=oninnodb_undo_tablespaces=1innodb_fast_shutdown=0innodb_max_dirty_pages_pct=1innodb_max_dirty_pages_pct_lwm=0.1innodb_adaptive_flushing=1innodb_adaptive_flushing_lwm=0.1innodb_flush_neighbors=0innodb_read_io_threads=4innodb_write_io_threads=4innodb_read_ahead_threshold=0innodb_buffer_pool_dump_at_shutdown=0innodb_buffer_pool_load_at_startup=0join_buffer_size=32Ksort_buffer_size=32Kinnodb_use_native_aio=1innodb_stats_persistent=1innodb_log_write_ahead_size=4096performance_schema=OFF
# Loggingslow_query_log = ONslow_query_log_file = /data/mariadb/data/slow.loglong_query_time = 2
# Character setcharacter-set-server = utf8mb4collation-server = utf8mb4_general_ci
# TidesDBplugin_load_add = ha_tidesdb.soplugin_maturity = gamma
# Row locking, optimistic by defaulttidesdb_pessimistic_locking = OFF
tidesdb_block_cache_size = 64Mtidesdb_max_open_sstables = 512tidesdb_unified_memtable_sync_mode = NONEtidesdb_unified_memtable_write_buffer_size = 64Mtidesdb_default_write_buffer_size = 64Mtidesdb_default_sync_mode = NONEtidesdb_default_compression = NONEtidesdb_flush_threads = 4tidesdb_compaction_threads = 4tidesdb_log_level = NONE# tidesdb_print_all_conflicts = ON
[client]port = 3306socket = /tmp/mariadb.sockdefault-character-set = utf8mb4
[mysqldump]quickmax_allowed_packet = 64M
[mariadb-backup]# mariabackup settings (defaults are fine)Both engines are aligned in configuration. Results below.


At 64MB TidesDB hit 69,320 NOPM / 160,779 TPM versus InnoDB’s 16,816 NOPM / 39,251 TPM, a 4.12x gap. NEWORD average fell from 8.18 ms to 3.723 ms, p99 from 16.442 ms to 5.89 ms. PAYMENT went 7.52 ms / 21.392 ms p99 down to 1.437 ms / 3.23 ms p99. DELIVERY, the heaviest transaction, dropped from 65.521 ms / 87.456 ms p99 to 10.28 ms / 16.878 ms p99, and SLEV collapsed from 55.293 ms average to 2.147 ms.
Now for the second run, larger buffers/caches mainly. For TidesDB we have 16GB block cache and 512MB unified memtable size. For InnoDB we have 16GB buffer pool and some other settings to align with TidesDB. This is testing mainly memory utilization, contention, etc.
Click to see MariaDB config
[mysqld]basedir = /data/mariadbdatadir = /data/mariadb/dataport = 3306socket = /tmp/mariadb.sockuser = rootpid-file = /data/mariadb/data/mariadb.pidlog-error = /data/mariadb/data/mariadb.err
# Networkingbind-address = 127.0.0.1max_connections = 1024# thread_handling = pool-of-threads# thread_pool_size = 16table_open_cache=2000table_open_cache_instances=16back_log=1500max_prepared_stmt_count=102400innodb_open_files=1024
sort_buffer_size = 24Mjoin_buffer_size = 24Mread_buffer_size = 24Mread_rnd_buffer_size = 24Mtmp_table_size = 4Gmax_heap_table_size = 256M
skip-log-binsync_binlog = 0
table_open_cache = 4096table_definition_cache = 2048
# InnoDB (inspired by https://hammerdb.com/ci-config/maria.cnf)default_storage_engine = InnoDBinnodb_buffer_pool_size = 16G#innodb_buffer_pool_instances = 4innodb_log_file_size = 2Ginnodb_log_buffer_size = 512Minnodb_flush_log_at_trx_commit = 0innodb_file_per_table = ONinnodb_doublewrite = 0innodb_flush_method = O_DIRECTinnodb_io_capacity = 10000innodb_io_capacity_max = 20000innodb_purge_threads = 4innodb_max_purge_lag_wait=0innodb_max_purge_lag=0innodb_max_purge_lag_delay=1innodb_lru_scan_depth=128innodb_read_only=0innodb_adaptive_hash_index=0innodb_undo_log_truncate=oninnodb_undo_tablespaces=1innodb_fast_shutdown=0innodb_max_dirty_pages_pct=1innodb_max_dirty_pages_pct_lwm=0.1innodb_adaptive_flushing=1innodb_adaptive_flushing_lwm=0.1innodb_flush_neighbors=0innodb_read_io_threads=8innodb_write_io_threads=8innodb_read_ahead_threshold=0innodb_buffer_pool_dump_at_shutdown=0innodb_buffer_pool_load_at_startup=0join_buffer_size=32Ksort_buffer_size=32Kinnodb_use_native_aio=1innodb_stats_persistent=1innodb_log_write_ahead_size=4096performance_schema=OFF
# Loggingslow_query_log = ONslow_query_log_file = /data/mariadb/data/slow.loglong_query_time = 2
# Character setcharacter-set-server = utf8mb4collation-server = utf8mb4_general_ci
# TidesDBplugin_load_add = ha_tidesdb.soplugin_maturity = gamma
# Row locking, optimistic by defaulttidesdb_pessimistic_locking = OFF
tidesdb_block_cache_size = 16Gtidesdb_max_open_sstables = 512tidesdb_unified_memtable_sync_mode = NONEtidesdb_unified_memtable_write_buffer_size = 512Mtidesdb_default_write_buffer_size = 512Mtidesdb_default_sync_mode = NONEtidesdb_default_compression = NONEtidesdb_flush_threads = 8tidesdb_compaction_threads = 8tidesdb_log_level = NONE# tidesdb_print_all_conflicts = ON
[client]port = 3306socket = /tmp/mariadb.sockdefault-character-set = utf8mb4
[mysqldump]quickmax_allowed_packet = 64M
[mariadb-backup]# mariabackup settings (defaults are fine)


With 16GB buffers on both sides TidesDB reached 128,400 NOPM / 297,433 TPM, InnoDB 37,423 NOPM / 87,167 TPM, a 3.43x gap. Throughput scaled for both (InnoDB 2.23x, TidesDB 1.85x over their small-buffer runs), but the tail is where it gets ugly. NEWORD p99 is 3.023 ms on TidesDB, 153.846 ms on InnoDB. DELIVERY p99 is 7.84 ms vs 278.751 ms. PAYMENT p99 is 1.956 ms vs 61.443 ms. The standard deviations show why, InnoDB NEWORD sd 27,072 and DELIVERY sd 53,663 versus 529 and 3,897 on TidesDB.
TidesDB wins both runs and the reason is primarily architectural, not tuning.
At 64MB InnoDB is memory-starved and gets beat 4.12x on NOPM. Give both engines 16GB and InnoDB scales 2.23x off a much lower base, TidesDB 1.85x, and TidesDB still wins 3.43x. The tail latency gap actually gets worse (NEWORD p99 3 ms vs 154 ms, DELIVERY p99 8 ms vs 279 ms). More buffer pool doesn’t fix InnoDB’s problem, it just delays it. The stalls do seem to be flush and checkpoint pauses blocking everything behind them, which you can see in the standard deviations (53k vs 3.8k on DELIVERY).
LSM writes append to a memtable, compaction runs off the critical path in background, no in-place page updates, no doublewrite, no purge thread catching up. That’s why commit latency stays tight even when InnoDB’s latency is spiking into the hundreds of ms.
You can find the raw data below:
| File | SHA256 Checksum |
|---|---|
| Small cache/buffer InnoDB | ed82ad7acc8d1030f9a346cb00b72cbeb2c65ec07f08cb261dc86c15c7dfab8b |
| Small cache/buffer TidesDB | f0ccbe509c3c8c0d568f10070070eaf9ba7129a4f36e2a77935cab75c0691504 |
| Large cache/buffer InnoDB | 643db8337a977e946c777b5c7bae4017524a754a1e5a6fee1fbbbb401775aba8 |
| Large cache/buffer TidesDB | 46323f2daf3b122ff775a57e3b6d67c329e819febe27640cf0ae6caddeaa4c89 |
That’s all for now, thank you for reading!