Blog / Engineering deep dives

Semurg against the databases you already run: what we have measured so far

27 October 2026 · Semurg · 3 min read · Markdown

benchmarksperformancegraphvectortime-seriesdocumentsearchkey-value

Most teams already run a graph database, a vector database, a time-series store, a document store and a search engine, each chosen for one job. Semurg is one engine for all of them, so the fair question is how it compares with each of those engines on its own ground. We answer it in public, with three rules: the same machine and the same data, every other engine in its fastest form (its embedded mode where it has one, its fastest client where it does not), and every engine must return the same answer before its time counts.

Graph

On SNAP's com-Orkut social graph, a 4-hop question about one person's network took Semurg 2.94 ms as a server and Neo4j 286 ms[1]; ArangoDB took 347 ms[2] and FalkorDB 207 ms[3].

One 4-hop query on the com-Orkut social graph, as a server: Semurg's bar is the shortest, and Neo4j, ArangoDB and FalkorDB each take many times longer.Semurg: 2.943 msSemurg2.943 msNeo4j: 285.713 msNeo4j285.713 msArangoDB: 347.244 msArangoDB347.244 msFalkorDB: 207.248 msFalkorDB207.248 ms
Source: [1] [2] [3].
The numbers
PartValueSource
Semurg2.943 ms[1]
Neo4j285.713 ms[1]
ArangoDB347.244 ms[2]
FalkorDB207.248 ms[3]

Vector

For a nearest-neighbour search, Semurg answered in 14.3 ms and Milvus in 19.0 ms[4], and pgvector in 59.3 ms[5].

Under concurrent load Semurg served 801 queries a second against Milvus's 127[6].

Time series

Reading the latest value of a series took Semurg 0.145 ms and TimescaleDB 0.34 ms[7], and InfluxDB 0.52 ms[8]. Under load Semurg served 96,693 queries a second against TimescaleDB's 19,353[9].

Reading a document by its id took Semurg 0.096 ms and MongoDB 0.26 ms[10]. Finding which documents hold a word took Semurg 0.11 ms and Meilisearch 0.37 ms[11], and Typesense 1.11 ms[12].

Key-value

Inside the application, reading a value took Semurg 0.005 ms, and Redis, at its fastest connection, 0.015 ms[13].

The ties

Not every published comparison is a win. A columnar query took Semurg 17.6 ms and ClickHouse 17.7 ms[14]. Reading the newest record of a stream took 0.30 ms on Semurg and 0.31 ms on Kafka[15]. Under load Semurg served 26,992 stream queries a second and Redpanda 30,730, inside the measured run-to-run band[16]. A knowledge-graph query took Semurg 0.18 ms and Postgres 0.21 ms[17]. Each of these is within the run-to-run noise of the two engines, so the page calls it a tie, not a win.

What is not on the page yet

A result we lose is published once we have worked on it, or after two releases at most, so some comparisons are still in that queue, mostly data-loading times. Relational, the multi-model and converged workloads, graph RAG and model inference are being measured on the current release and land on the benchmark page as they finish, wins and losses alike.

Run it yourself

Every chart on the benchmark page names the published release it was measured on and the machine it ran on, and the page links the kit that reruns the same questions against the same engines on your own hardware. If you run one of these databases in production, we would like to know which comparison you trust most, and which one you would add.

Evidence

  1. Benchmark One query, 4 hops: Semurg 2.943, neo4j 285.713 (r11.118) (bench:graph/t2/server/neo4j@r11.118; the record as JSON)
  2. Benchmark One query, 4 hops: Semurg 2.943, arangodb 347.244 (r11.118) (bench:graph/t2/server/arangodb@r11.118; the record as JSON)
  3. Benchmark One query, 4 hops: Semurg 2.943, falkordb 207.248 (r11.118) (bench:graph/t2/server/falkordb@r11.118; the record as JSON)
  4. Benchmark One query, exact search: Semurg 14.338, milvus 19.024 (r11.123) (bench:vector/t2/server/milvus@r11.123; the record as JSON)
  5. Benchmark One query, exact search: Semurg 14.338, pgvector 59.263 (r11.123) (bench:vector/t2/server/pgvector@r11.123; the record as JSON)
  6. Benchmark 16 queries at once, exact search: Semurg 800.728, milvus 127.465 (r11.123) (bench:vector/t2_throughput/server/milvus@r11.123; the record as JSON)
  7. Benchmark One query: Semurg 0.145, timescaledb 0.34 (r11.127) (bench:time_series/t2/server/timescaledb@r11.127; the record as JSON)
  8. Benchmark One query: Semurg 0.145, influxdb 0.523 (r11.127) (bench:time_series/t2/server/influxdb@r11.127; the record as JSON)
  9. Benchmark 16 queries at once: Semurg 96692.5, timescaledb 19353.333 (r11.127) (bench:time_series/t2_throughput/server/timescaledb@r11.127; the record as JSON)
  10. Benchmark One read by id: Semurg 0.096, mongodb 0.26 (r11.121) (bench:document/t2/server/mongodb@r11.121; the record as JSON)
  11. Benchmark One search: Semurg 0.11, meilisearch 0.366 (r11.123) (bench:search/t2/server/meilisearch@r11.123; the record as JSON)
  12. Benchmark One search: Semurg 0.11, typesense 1.113 (r11.123) (bench:search/t2/server/typesense@r11.123; the record as JSON)
  13. Benchmark One read (point get): Semurg 0.005, redis 0.015 (r11.124) (bench:key_value/t2/embedded/redis@r11.124; the record as JSON)
  14. Benchmark One query, a filtered sum: Semurg 17.582, clickhouse 17.738 (r11.125) (bench:columnar/t2/server/clickhouse@r11.125; the record as JSON)
  15. Benchmark Deliver one message: Semurg 0.295, kafka 0.31 (r11.126) (bench:streaming/t2/server/kafka@r11.126; the record as JSON)
  16. Benchmark 16 deliveries at once: Semurg 26991.667, redpanda 30730.0 (r11.126) (bench:streaming/t2_throughput/server/redpanda@r11.126; the record as JSON)
  17. Benchmark One question, 2 hops: Semurg 0.184, postgres 0.208 (r11.125) (bench:knowledge/t2/server/postgres@r11.125; the record as JSON)

Related