Benchmark 2M Profiles

July 11, 2026 ยท View on GitHub

Charts

Execution Time

Execution Time

Write Throughput

Write Throughput

Lookup Throughput

Lookup Throughput

Index Scan Throughput

Index Scan Throughput

Query Throughput

Query Throughput

Resource Footprint

Resource Footprint

Total By Engine

EngineStatusRun timeCompleted phase timePre-read stabilizePost-update stabilizeSettleReopenVerifyStorageProcess peak memoryFinal checksum
ZoneTreeCompleted181_390 ms173_393 ms3_171 ms4_104 ms17 ms150 ms9 ms147.6 MB3.3 GBA7EB98FFC773884D
RocksDBCompleted429_036 ms422_502 ms1_947 ms3_965 ms0 ms45 ms363 ms623.2 MB1.1 GBA7EB98FFC773884D
SQLiteCompleted1_062_037 ms1_061_894 msn/an/a61 ms0 ms2 ms569.6 MB1.4 GBA7EB98FFC773884D
MySQLCompleted807_028 ms806_726 msn/an/a1 ms3 ms83 ms618.1 MB234.9 MBA7EB98FFC773884D

Correctness

Checksum validation passed across completed engines: ZoneTree, RocksDB, SQLite, MySQL.

Interpretation Notes

  • This benchmark measures live single-operation profile inserts, updates, reads, and indexed queries.
  • ZoneTree and RocksDB secondary indexes are maintained by the benchmark application using separate stores.
  • SQLite and MySQL maintain secondary indexes inside the database engine.
  • MySQL is measured as a client/server database over TCP.
  • Embedded engines run in the benchmark process.
  • Completed phase time is the sum of measured workload phases. Run time also includes initialization, stabilization, settle/checkpoint, reopen, verification, and reporting overhead.
  • The write throughput chart includes raw write phases and derived write-readiness bars that add the following stabilization phase.
  • Storage is measured after each engine settles or checkpoints its data.
  • Process peak memory is measured for the benchmark process. For MySQL, this excludes MySQL server/container memory.

Write Readiness

EngineInsertPre-read stabilizeInsert + stabilizeInsert ready throughputUpdatePost-update stabilizeUpdate + stabilizeUpdate ready throughput
ZoneTree10_985 ms3_171 ms14_156 ms141_281/s27_451 ms4_104 ms31_555 ms63_381/s
RocksDB11_009 ms1_947 ms12_957 ms154_360/s30_965 ms3_965 ms34_930 ms57_257/s
SQLite320_953 msn/a320_953 ms6_231/s393_971 msn/a393_971 ms5_077/s
MySQL59_427 msn/a59_427 ms33_655/s114_801 msn/a114_801 ms17_421/s

Phase Results

ZoneTree

PhaseOperationsTimeThroughputChecksum
insert profiles2_000_00010_985 ms182_070/s4F24F178E189EEA5
read by user id2_000_0002_062 ms970_010/s94FEA7BBDF9EB16F
lookup by email2_000_0005_143 ms388_867/s7911E6F89610C9DB
scan country/status index500_0003_161 ms158_199/s560B74664AA52578
query country/status500_00025_152 ms19_879/sFCF2C9270FA9B0B9
scan created-at index500_0003_502 ms142_770/sC8D3546404935759
query created-at range500_00023_198 ms21_554/sC3FDD5908A1458BA
scan top reputation index500_0002_082 ms240_191/sE7D19A7DA1270425
query top reputation500_00016_003 ms31_244/s5DFA72D2DB36D325
update profiles2_000_00027_451 ms72_856/s1100814B966927C5
post-update read by user id2_000_0002_063 ms969_623/sB004A4D20A4A3848
post-update lookup by email2_000_0004_978 ms401_774/sD353A40B4BEBE4B5
post-update scan country/status index500_0003_013 ms165_926/sA45CF3AB6613BF9E
post-update query country/status500_00025_483 ms19_621/s7899EECCB1694A86
post-update scan top reputation index500_0002_254 ms221_836/s629516A23DD07125
post-update query top reputation500_00016_864 ms29_648/s15A3B24C38088C25

RocksDB

PhaseOperationsTimeThroughputChecksum
insert profiles2_000_00011_009 ms181_662/s4F24F178E189EEA5
read by user id2_000_0007_349 ms272_133/s94FEA7BBDF9EB16F
lookup by email2_000_00014_443 ms138_471/s7911E6F89610C9DB
scan country/status index500_0005_933 ms84_270/s560B74664AA52578
query country/status500_00059_838 ms8_356/sFCF2C9270FA9B0B9
scan created-at index500_0008_846 ms56_520/sC8D3546404935759
query created-at range500_00066_680 ms7_498/sC3FDD5908A1458BA
scan top reputation index500_0005_550 ms90_094/sE7D19A7DA1270425
query top reputation500_00059_155 ms8_452/s5DFA72D2DB36D325
update profiles2_000_00030_965 ms64_589/s1100814B966927C5
post-update read by user id2_000_0007_483 ms267_256/sB004A4D20A4A3848
post-update lookup by email2_000_00014_695 ms136_105/sD353A40B4BEBE4B5
post-update scan country/status index500_0005_962 ms83_866/sA45CF3AB6613BF9E
post-update query country/status500_00060_380 ms8_281/s7899EECCB1694A86
post-update scan top reputation index500_0005_433 ms92_030/s629516A23DD07125
post-update query top reputation500_00058_779 ms8_506/s15A3B24C38088C25

SQLite

PhaseOperationsTimeThroughputChecksum
insert profiles2_000_000320_953 ms6_231/s4F24F178E189EEA5
read by user id2_000_0004_945 ms404_469/s94FEA7BBDF9EB16F
lookup by email2_000_0007_204 ms277_620/s7911E6F89610C9DB
scan country/status index500_0008_828 ms56_640/s560B74664AA52578
query country/status500_00058_875 ms8_493/sFCF2C9270FA9B0B9
scan created-at index500_0008_851 ms56_489/sC8D3546404935759
query created-at range500_00053_102 ms9_416/sC3FDD5908A1458BA
scan top reputation index500_0007_529 ms66_413/sE7D19A7DA1270425
query top reputation500_00055_484 ms9_012/s5DFA72D2DB36D325
update profiles2_000_000393_971 ms5_077/s1100814B966927C5
post-update read by user id2_000_0004_945 ms404_482/sB004A4D20A4A3848
post-update lookup by email2_000_0007_240 ms276_253/sD353A40B4BEBE4B5
post-update scan country/status index500_0008_789 ms56_892/sA45CF3AB6613BF9E
post-update query country/status500_00058_213 ms8_589/s7899EECCB1694A86
post-update scan top reputation index500_0007_539 ms66_318/s629516A23DD07125
post-update query top reputation500_00055_427 ms9_021/s15A3B24C38088C25

MySQL

PhaseOperationsTimeThroughputChecksum
insert profiles2_000_00059_427 ms33_655/s4F24F178E189EEA5
read by user id2_000_00038_793 ms51_555/s94FEA7BBDF9EB16F
lookup by email2_000_00044_318 ms45_129/s7911E6F89610C9DB
scan country/status index500_00026_917 ms18_575/s560B74664AA52578
query country/status500_00073_834 ms6_772/sFCF2C9270FA9B0B9
scan created-at index500_00023_679 ms21_116/sC8D3546404935759
query created-at range500_00072_299 ms6_916/sC3FDD5908A1458BA
scan top reputation index500_00019_206 ms26_034/sE7D19A7DA1270425
query top reputation500_00068_032 ms7_350/s5DFA72D2DB36D325
update profiles2_000_000114_801 ms17_421/s1100814B966927C5
post-update read by user id2_000_00039_021 ms51_255/sB004A4D20A4A3848
post-update lookup by email2_000_00044_460 ms44_984/sD353A40B4BEBE4B5
post-update scan country/status index500_00026_839 ms18_630/sA45CF3AB6613BF9E
post-update query country/status500_00072_737 ms6_874/s7899EECCB1694A86
post-update scan top reputation index500_00019_414 ms25_754/s629516A23DD07125
post-update query top reputation500_00062_950 ms7_943/s15A3B24C38088C25

Configuration

  • Profiles: 2_000_000
  • Profile writes: individual operations
  • UserId reads: 2_000_000
  • Email lookups: 2_000_000
  • Query count: 500_000
  • Profile updates: 2_000_000
  • Post-update UserId reads: 2_000_000
  • Post-update email lookups: 2_000_000
  • Post-update query count: 500_000
  • Query limit: 100
  • Seed: 570123434
  • Timeout: 120_000 seconds per engine

Environment

  • OS: Ubuntu 24.04.3 LTS
  • Architecture: X64
  • .NET: 10.0.9
  • CPU: AMD EPYC 4345P 8-Core Processor
  • Logical processors: 16
  • Total available memory: 60.4 GB
  • Initial process working set: 173.7 MB

Engine Settings

ZoneTree

  • MutableSegmentMaxItemCount: 250000
  • SparseArrayStepSize: 16
  • KeyCacheSize: 1024
  • ValueCacheSize: 1024
  • IteratorPrefetchSize: 16
  • BlockCacheLifeTime: 1 minutes
  • BottomMergePolicy: Full bottom merge when bottom segment count exceeds 1
  • ReadStabilization: Settle before read/query phases

RocksDB

  • Databases: profiles,email-index,country-status-index,created-at-index,reputation-index
  • Compression: Zstd
  • WriteBufferMb: 1024
  • MaxWriteBufferNumber: 4
  • WriteSync: false
  • ReadStabilization: Compact before read/query phases

SQLite

  • JournalMode: WAL
  • Synchronous: NORMAL
  • CacheMb: 1024
  • MmapMb: 1024
  • TempStore: MEMORY

MySQL

  • Host: 127.0.0.1
  • Port: 3306
  • Database: profilebench
  • User: root

Durability Settings

  • ZoneTree: AsyncCompressed WAL default; MutableSegmentMaxItemCount=250000; SparseArrayStepSize=16; KeyCacheSize=1024; ValueCacheSize=1024; IteratorPrefetchSize=16; BlockCacheLifeTime=1 minutes; application-managed secondary indexes; background maintainers enabled.
  • RocksDB: WAL enabled; five separate RocksDB instances; no WriteBatch across indexes; compression=Zstd; write_buffer_size=1024 MB per database; max_write_buffer_number=4.
  • SQLite: WAL journal mode; synchronous=NORMAL; cache=1024 MB; mmap=1024 MB; native SQL indexes; single-row writes use autocommit.
  • MySQL: InnoDB; benchmark Docker disables binlog, sets innodb_flush_log_at_trx_commit=2 and sync_binlog=0; native SQL indexes; single-row writes use autocommit.