berkeley db 5.x C API 有什么方法可以获取与前缀匹配的键的所有记录?
(不扫描整个数据库)
也许使用 Btree 前缀比较自定义回调?
解决方案有两个部分。首先,您需要使用自定义键比较功能。
dbp->set_bt_compare(dbp, cmp_fn);
在比较功能中,使具有相同前缀的键在数据库中彼此相邻排序。这可能就像一堆小于比较一样简单,因此类似于0x000000000000000000000001
is less than 0x000000000000000000000002
。
要进行搜索,请打开光标并cursor->get()
使用DB_SET_RANGE
标志执行 a。将起始键设置为前缀范围的开头。比如说,如果您正在寻找带有前缀 的键0x1138
,您可以将键设置为0x113800000000000000000000
. 然后继续调用cursor->get()
。DB_NEXT
当你看到一个没有0x1138
前缀的键时,你就完成了。
这种技术不必扫描整个数据库,因为初始DB_SET_RANGE
调用会在正确的位置启动游标,并且记录在树中彼此相邻。