【发布时间】:2018-04-10 03:23:56
【问题描述】:
我对嵌入式键值数据库相对于每个键仅在磁盘上存储一个文件的简单解决方案的优势感到困惑。例如,RocksDB、Badger、SQLite 等数据库使用 B+ 树和 LSM 等花哨的数据结构,但似乎获得与这个简单解决方案大致相同的性能。
例如,Badger(这是最快的 Go 嵌入式数据库)使用 about 800 microseconds 写入条目。相比之下,从头开始创建一个新文件并向其中写入一些数据需要 150 个麦克风而无需优化。
编辑:澄清一下,这是我与最先进的嵌入式数据库进行比较的键值存储的简单实现。只需将每个键散列到字符串文件名,并将关联的值存储为该文件名的字节数组。读取和写入每个大约 150 个麦克风,对于单个操作来说比 Badger 快,对于批量操作来说是可比的。此外,磁盘空间非常小,因为除了实际值之外,我们不存储任何额外的结构。
我一定在这里遗漏了一些东西,因为人们实际使用的解决方案非常精美,并且使用了布隆过滤器和 B+ 树之类的东西进行了优化。
【问题讨论】:
-
数据库不仅仅是将内容写入磁盘,而是如何管理它们(事务、查询、更新、排序等)。如果您将内容存储到原始文件(例如每个密钥一个磁盘),您将不会拥有这些优势,除非您自己实现这些功能。此外,每个文件都有占用磁盘空间的元数据。如果您的内容大小小于元数据大小,那么“每个密钥一个文件”的解决方案将是低效的。
-
这里只是一个疯狂的猜测,我认为随着越来越多的小文件的添加,您最终会遇到文件系统瓶颈。此外,随着每批中键数量的增加,批量写入和读取可能会超过单个文件的打开/写入/读取操作?
标签: sqlite go embedded-database rocksdb