为什么 LMDB 在已有数据的键上表现更好?

Why does LMDB perform better on keys which already have previous data?

我一直在使用 LMDB 开发一个系统,我偶然发现了一些我不理解的奇怪特性,所以我希望你能帮助我。

我发现如果我有一些数据;任何数据;更小的数据;以前最初写为键的值,与我同时写入一个新的键和值相比,数据库将更快并且写入性能的差异更小。

目前这对我来说意义不大。我本以为,如果密钥使用大小不同的数据初始化,则不会有任何效果。即使为键的实际值保留 space 有一些优势,但这还是不够的。显然不是。

为什么会出现这种情况?是否还有任何其他数据库表现出这种行为?

提前感谢您的帮助, 迈克尔

if I were to have some data; any data; even smaller sized data; previously written as key's value initially, the database will be faster and have less variance to its write performance

影响感知数据库性能的因素有很多。但是,要关注您正在观察的效果,请考虑 LMDB 如何管理其存储。当然,您可以查看代码,但通常在数据库实现中,如果您遇到实现者的问题,仅考虑您将如何做会有所帮助。

您似乎假设每条 LMDB 记录的大小正好等于其键和数据大小的总和。如果是这样,那么较小的现有数据将迫使 LMDB 分配一个新的 ... something 来保存较大的更新值。并且 LMDB 必须根据每条记录的确切大小来管理其存储。

为了避免这些问题,ISTR LDMB 使用一些固定大小的内存 "bins"。新记录从其大小可容纳数据的容器中获得分配。也许您的测试恰好大小相似,可以放入同一个容器中,所以您所做的只是覆盖相同的存储。