Badger was written with these design goals in mind:
- Write a key-value database in pure Go.
- Use latest research to build the fastest KV database for data sets spanning terabytes.
- Optimize for SSDs.
Badger’s design is based on a paper titled WiscKey: Separating Keys from Values in SSD-conscious Storage.
|Design||LSM tree with value log||LSM tree only||B+ tree|
|High Read throughput||Yes||No||Yes|
|High Write throughput||Yes||Yes||No|
|Designed for SSDs||Yes (with latest research 1)||Not specifically 2||No|
|Sorted KV access||Yes||Yes||Yes|
|Pure Go (no Cgo)||Yes||No||Yes|
|Transactions||Yes, ACID, concurrent with SSI3||Yes (but non-ACID)||Yes, ACID|
|3D access (key-value-version)||Yes4||No||No|
1 The WISCKEY paper (on which Badger is based) saw big wins with separating values from keys, significantly reducing the write amplification compared to a typical LSM tree.
2 RocksDB is an SSD optimized version of LevelDB, which was designed specifically for rotating disks. As such RocksDB’s design isn’t aimed at SSDs.
3 SSI: Serializable Snapshot Isolation. For more details, see the blog post Concurrent ACID Transactions in Badger
4 Badger provides direct access to value versions via its Iterator API. Users can also specify how many versions to keep per key via Options.
We have run comprehensive benchmarks against RocksDB, Bolt and LMDB. The benchmarking code, and the detailed logs for the benchmarks can be found in the badger-bench repo. More explanation, including graphs can be found the blog posts (linked above).