Benchmark 1M 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
ZoneTreeCompleted86_870 ms82_010 ms1_765 ms2_368 ms95 ms156 ms8 ms73.4 MB2.5 GBB7578931045C8FC5
RocksDBCompleted211_242 ms206_326 ms1_634 ms2_809 ms0 ms44 ms181 ms313.3 MB639.4 MBB7578931045C8FC5
SQLiteCompleted554_394 ms554_199 msn/an/a128 ms0 ms2 ms284.6 MB769.8 MBB7578931045C8FC5
MySQLCompleted413_523 ms413_262 msn/an/a1 ms3 ms43 ms311.7 MB166.9 MBB7578931045C8FC5

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
ZoneTree4_905 ms1_765 ms6_670 ms149_925/s10_270 ms2_368 ms12_637 ms79_132/s
RocksDB5_355 ms1_634 ms6_990 ms143_070/s13_908 ms2_809 ms16_717 ms59_820/s
SQLite219_596 msn/a219_596 ms4_554/s163_694 msn/a163_694 ms6_109/s
MySQL31_778 msn/a31_778 ms31_468/s62_963 msn/a62_963 ms15_882/s

Phase Results

ZoneTree

PhaseOperationsTimeThroughputChecksum
insert profiles1_000_0004_905 ms203_874/s70EEB1E90366F6E5
read by user id1_000_000964 ms1_037_418/s0FB577C390019AC8
lookup by email1_000_0002_179 ms458_825/s9C199CC596F7AC10
scan country/status index250_0001_691 ms147_818/sB3350AAEFBCE068F
query country/status250_00012_735 ms19_631/s11A194A99CB7D634
scan created-at index250_0001_727 ms144_780/sE3FE4E613ABE23A5
query created-at range250_00011_107 ms22_507/sB8595B9702849552
scan top reputation index250_0001_127 ms221_877/sFD457DADD7424105
query top reputation250_0008_509 ms29_382/sB472892F8C7EF235
update profiles1_000_00010_270 ms97_375/s2440ADD57E65500B
post-update read by user id1_000_000899 ms1_111_751/s7DB9AA24CC9A8B8E
post-update lookup by email1_000_0002_123 ms470_936/s43569B6DA38ACCB5
post-update scan country/status index250_0001_497 ms167_055/s896A595A5F979F99
post-update query country/status250_00012_925 ms19_342/sEF5D80897CBF7824
post-update scan top reputation index250_0001_130 ms221_172/s905E8A81EE9017E5
post-update query top reputation250_0008_221 ms30_410/s1A17E74A9E34D635

RocksDB

PhaseOperationsTimeThroughputChecksum
insert profiles1_000_0005_355 ms186_730/s70EEB1E90366F6E5
read by user id1_000_0003_548 ms281_840/s0FB577C390019AC8
lookup by email1_000_0006_739 ms148_379/s9C199CC596F7AC10
scan country/status index250_0002_984 ms83_790/sB3350AAEFBCE068F
query country/status250_00029_568 ms8_455/s11A194A99CB7D634
scan created-at index250_0004_291 ms58_259/sE3FE4E613ABE23A5
query created-at range250_00032_592 ms7_670/sB8595B9702849552
scan top reputation index250_0002_783 ms89_830/sFD457DADD7424105
query top reputation250_00029_008 ms8_618/sB472892F8C7EF235
update profiles1_000_00013_908 ms71_903/s2440ADD57E65500B
post-update read by user id1_000_0003_608 ms277_178/s7DB9AA24CC9A8B8E
post-update lookup by email1_000_0006_819 ms146_653/s43569B6DA38ACCB5
post-update scan country/status index250_0002_928 ms85_390/s896A595A5F979F99
post-update query country/status250_00030_163 ms8_288/sEF5D80897CBF7824
post-update scan top reputation index250_0002_768 ms90_324/s905E8A81EE9017E5
post-update query top reputation250_00029_263 ms8_543/s1A17E74A9E34D635

SQLite

PhaseOperationsTimeThroughputChecksum
insert profiles1_000_000219_596 ms4_554/s70EEB1E90366F6E5
read by user id1_000_0002_446 ms408_850/s0FB577C390019AC8
lookup by email1_000_0003_458 ms289_196/s9C199CC596F7AC10
scan country/status index250_0004_417 ms56_598/sB3350AAEFBCE068F
query country/status250_00028_739 ms8_699/s11A194A99CB7D634
scan created-at index250_0004_363 ms57_303/sE3FE4E613ABE23A5
query created-at range250_00026_320 ms9_498/sB8595B9702849552
scan top reputation index250_0003_735 ms66_928/sFD457DADD7424105
query top reputation250_00027_228 ms9_182/sB472892F8C7EF235
update profiles1_000_000163_694 ms6_109/s2440ADD57E65500B
post-update read by user id1_000_0002_444 ms409_096/s7DB9AA24CC9A8B8E
post-update lookup by email1_000_0003_462 ms288_809/s43569B6DA38ACCB5
post-update scan country/status index250_0004_364 ms57_290/s896A595A5F979F99
post-update query country/status250_00028_786 ms8_685/sEF5D80897CBF7824
post-update scan top reputation index250_0003_751 ms66_657/s905E8A81EE9017E5
post-update query top reputation250_00027_396 ms9_126/s1A17E74A9E34D635

MySQL

PhaseOperationsTimeThroughputChecksum
insert profiles1_000_00031_778 ms31_468/s70EEB1E90366F6E5
read by user id1_000_00019_397 ms51_553/s0FB577C390019AC8
lookup by email1_000_00022_003 ms45_448/s9C199CC596F7AC10
scan country/status index250_00013_506 ms18_511/sB3350AAEFBCE068F
query country/status250_00037_179 ms6_724/s11A194A99CB7D634
scan created-at index250_00011_741 ms21_292/sE3FE4E613ABE23A5
query created-at range250_00036_349 ms6_878/sB8595B9702849552
scan top reputation index250_0009_643 ms25_926/sFD457DADD7424105
query top reputation250_00034_542 ms7_238/sB472892F8C7EF235
update profiles1_000_00062_963 ms15_882/s2440ADD57E65500B
post-update read by user id1_000_00019_517 ms51_237/s7DB9AA24CC9A8B8E
post-update lookup by email1_000_00022_199 ms45_047/s43569B6DA38ACCB5
post-update scan country/status index250_00013_391 ms18_670/s896A595A5F979F99
post-update query country/status250_00036_584 ms6_834/sEF5D80897CBF7824
post-update scan top reputation index250_0009_701 ms25_771/s905E8A81EE9017E5
post-update query top reputation250_00032_771 ms7_629/s1A17E74A9E34D635

Configuration

  • Profiles: 1_000_000
  • Profile writes: individual operations
  • UserId reads: 1_000_000
  • Email lookups: 1_000_000
  • Query count: 250_000
  • Profile updates: 1_000_000
  • Post-update UserId reads: 1_000_000
  • Post-update email lookups: 1_000_000
  • Post-update query count: 250_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: 115.4 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.