五种基于go的轻量级数据库的比较

五种基于go的轻量级数据库的比较

本项目基于github上的开源项目badger-bench对五种基于go的轻量级数据库——badger、lmdb、boltdb、rocksdb,leveldb——进行比较。
项目原址:
badger-bench

一、实验环境

​ 本项目的运行环境为Ubuntu 9.3.0-17ubuntu1~20.04,逻辑cpu数为16

数据库版本为

  • badger@v3.2103.0
  • lmdb@v1.8.0
  • bolt@v1.3.1
  • rocksdb@v6.22.1
  • leveldb@v1.0.0

二、存储

存储操作通过调整键值对的数量和value的大小在不同条件下对数据库进行性能的分析。在相同条件下,对比不同数据库的存储时间和空间,横向比对数据库的存储性能。

2.1存储空间

假设存储数据量为N,单位为百万,比对不同value大小下的数据大小
N=0.4M
image4
N=0.8M
image3
N=1M
image2
N=2M
image1
可以看出,在数据量较大的情况下,lmdb占用的存储空间较大,leveldb和rocksdb占用的空间较小,但总的差别不是很大。

2.2存储时间

假设存储数据量为N,单位为百万,比对不同value大小下的存储时间
N=0.4M
image8
N=0.8M
image7
N=1M
image6
N=2M
image5
在数据量较大的情况下,lmdb显示出比较良好的性能,而leveldb随着value值的增大,耗时明显上升。

2.3 结论

  • 对于存储空间,leveldb和bager在数据量较大时占用的空间较小,而lmdb所占用的空间相比其他数据库要大些。
  • 对于存储时间,lmdb在数据量较大的情况下明显要低于其他数据库,rocksdb/bolt/badger的差距不是很大,leveldb明显要高于其他四种。

三、遍历

遍历操作对数据库中的键值对进行遍历,并统计运行时间
以数据量大小为20W的数据为例
image9

可以看出,lmdb遍历所花费的时间相较于其他数据库较长,badger采用键和值分别存储的方式,分别遍历键和值,再找到对应的(key,value)对,速度较快,遍历性能badger>rock>bolt>lmdb。

四、随机读

随机读操作通过随机生成key,从数据库中取出对应value。
以数据量大小为20W的数据为例,采用16线程对数据库进行总计320W次读操作。由于随机读操作存在命中cache和未命中的情况,采用的随机算法将这几种数据库的命中率控制为65%左右。信息如下所示:
image10

    BenchmarkReadRandomBolt/read-randombolt
        bench_test.go:105: bolt: 2070283 keys had valid values.
        bench_test.go:106: bolt: 1129717 keys had no values
        bench_test.go:107: bolt: 0 keys had errors
        bench_test.go:108: bolt: 3200000 total keys looked at
        bench_test.go:109: bolt: hit rate : 0.65

可以看出,lmdb和bolt在value较大的情况下,读取速度明显高于其余两种,而rockdb的读取速度较慢,badger的读取性能介于两者之间。随机读性能lmdb≈bolt>badger>rockdb

五、结论

  • 在对存储时间有较高需求的情况下,lmdb为较优选择,缺点是存储文件较大,遍历时间较长。leveldb为最差选择。
  • 在对存储空间有较高需求的情况下,leveldb和bager可作为选择,缺点在于leveldb的存储速度很慢。lmdb为最差选择。
  • 在对遍历时间要求较高的情况下,badger为较优选择,缺点是存储性能不是很好,时间较长。lmdb为最差选择。
  • 在对随机读时间要求较高的情况下,bolt和lmdb为较优选择,缺点是bolt的遍历操纵时间较长。rocksdb为最差选择。

发表评论

邮箱地址不会被公开。 必填项已用*标注