Benchmark 100K 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
ZoneTreeCompleted9_223 ms8_378 ms194 ms182 ms16 ms42 ms7 ms7.4 MB440.5 MB1C7232F217FD84C5
RocksDBCompleted19_335 ms18_721 ms130 ms214 ms0 ms89 ms19 ms31.8 MB163.6 MB1C7232F217FD84C5
SQLiteCompleted45_642 ms45_559 msn/an/a17 ms0 ms1 ms28.3 MB140.7 MB1C7232F217FD84C5
MySQLCompleted40_643 ms40_222 msn/an/a1 ms3 ms6 ms33.2 MB100.3 MB1C7232F217FD84C5

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
ZoneTree528 ms194 ms722 ms138_571/s584 ms182 ms766 ms130_570/s
RocksDB533 ms130 ms663 ms150_801/s976 ms214 ms1_190 ms84_032/s
SQLite15_985 msn/a15_985 ms6_256/s12_664 msn/a12_664 ms7_897/s
MySQL3_910 msn/a3_910 ms25_577/s5_411 msn/a5_411 ms18_482/s

Phase Results

ZoneTree

PhaseOperationsTimeThroughputChecksum
insert profiles100_000528 ms189_385/s37C6E9056D5AC045
read by user id100_000188 ms533_046/s3C75C3A02940F75F
lookup by email100_000358 ms279_315/s8EACBB38279A3446
scan country/status index25_000538 ms46_497/s550DE764BD164CCC
query country/status25_0001_380 ms18_118/s8A71BD4E88816061
scan created-at index25_000150 ms166_148/s1BED8F615F0CDA9D
query created-at range25_0001_045 ms23_914/sDD87F18F9230D64C
scan top reputation index25_000120 ms207_880/s5045A3EB2C7535C5
query top reputation25_000860 ms29_062/s3C71031ED8049A9D
update profiles100_000584 ms171_148/sFA3F051A503B5D43
post-update read by user id100_00071 ms1_403_521/s2AD19D2C2B2F8F3D
post-update lookup by email100_000219 ms457_290/s6B8148031A502EBA
post-update scan country/status index25_000136 ms184_230/sD57DAE36F8AAE9C3
post-update query country/status25_0001_228 ms20_365/s1583D5A1C67A8B7C
post-update scan top reputation index25_000117 ms213_246/s4EAFA92C8AA7C495
post-update query top reputation25_000856 ms29_201/s8A0AD194E6834A4D

RocksDB

PhaseOperationsTimeThroughputChecksum
insert profiles100_000533 ms187_637/s37C6E9056D5AC045
read by user id100_000265 ms377_300/s3C75C3A02940F75F
lookup by email100_000384 ms260_691/s8EACBB38279A3446
scan country/status index25_000428 ms58_430/s550DE764BD164CCC
query country/status25_0002_917 ms8_570/s8A71BD4E88816061
scan created-at index25_000320 ms78_215/s1BED8F615F0CDA9D
query created-at range25_0002_898 ms8_626/sDD87F18F9230D64C
scan top reputation index25_000278 ms89_871/s5045A3EB2C7535C5
query top reputation25_0002_783 ms8_982/s3C71031ED8049A9D
update profiles100_000976 ms102_437/sFA3F051A503B5D43
post-update read by user id100_000247 ms404_245/s2AD19D2C2B2F8F3D
post-update lookup by email100_000353 ms283_223/s6B8148031A502EBA
post-update scan country/status index25_000290 ms86_183/sD57DAE36F8AAE9C3
post-update query country/status25_0002_935 ms8_518/s1583D5A1C67A8B7C
post-update scan top reputation index25_000277 ms90_226/s4EAFA92C8AA7C495
post-update query top reputation25_0002_837 ms8_813/s8A0AD194E6834A4D

SQLite

PhaseOperationsTimeThroughputChecksum
insert profiles100_00015_985 ms6_256/s37C6E9056D5AC045
read by user id100_000255 ms391_954/s3C75C3A02940F75F
lookup by email100_000287 ms348_029/s8EACBB38279A3446
scan country/status index25_000451 ms55_469/s550DE764BD164CCC
query country/status25_0002_869 ms8_715/s8A71BD4E88816061
scan created-at index25_000433 ms57_717/s1BED8F615F0CDA9D
query created-at range25_0002_566 ms9_743/sDD87F18F9230D64C
scan top reputation index25_000387 ms64_682/s5045A3EB2C7535C5
query top reputation25_0002_731 ms9_154/s3C71031ED8049A9D
update profiles100_00012_664 ms7_897/sFA3F051A503B5D43
post-update read by user id100_000218 ms458_837/s2AD19D2C2B2F8F3D
post-update lookup by email100_000284 ms352_135/s6B8148031A502EBA
post-update scan country/status index25_000437 ms57_238/sD57DAE36F8AAE9C3
post-update query country/status25_0002_875 ms8_696/s1583D5A1C67A8B7C
post-update scan top reputation index25_000381 ms65_637/s4EAFA92C8AA7C495
post-update query top reputation25_0002_738 ms9_131/s8A0AD194E6834A4D

MySQL

PhaseOperationsTimeThroughputChecksum
insert profiles100_0003_910 ms25_577/s37C6E9056D5AC045
read by user id100_0001_906 ms52_464/s3C75C3A02940F75F
lookup by email100_0002_076 ms48_180/s8EACBB38279A3446
scan country/status index25_0001_429 ms17_496/s550DE764BD164CCC
query country/status25_0003_614 ms6_917/s8A71BD4E88816061
scan created-at index25_0001_138 ms21_973/s1BED8F615F0CDA9D
query created-at range25_0003_421 ms7_308/sDD87F18F9230D64C
scan top reputation index25_000979 ms25_524/s5045A3EB2C7535C5
query top reputation25_0003_269 ms7_647/s3C71031ED8049A9D
update profiles100_0005_411 ms18_482/sFA3F051A503B5D43
post-update read by user id100_0001_874 ms53_374/s2AD19D2C2B2F8F3D
post-update lookup by email100_0002_068 ms48_363/s6B8148031A502EBA
post-update scan country/status index25_0001_403 ms17_817/sD57DAE36F8AAE9C3
post-update query country/status25_0003_551 ms7_040/s1583D5A1C67A8B7C
post-update scan top reputation index25_000970 ms25_775/s4EAFA92C8AA7C495
post-update query top reputation25_0003_203 ms7_804/s8A0AD194E6834A4D

Configuration

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