范围查询
我们已经实现了KV存储顶部的表结构,我们能够通过主键检索记录。在本章中,我们将添加以排序顺序检索一系列记录的能力。
B-树迭代器
第一步是将范围查询添加到B树中。
BIter
类型允许我们迭代地遍历B树。BIter
是从根结点到叶结点中的KV对的路径。移动迭代器只是将位置或节点移动到同级。:B树SeekLE是在范围查询中查找初始位置的函数。它只是一个记录路径的普通B树查找。
NodeLookupLE函数仅适用于范围查询中的“小于或等于”运算符,对于其他3个运算符(小于、大于、大于或等于),结果可能为一个。我们会用BT树解决的。寻求功能。
数据序列化
要支持范围查询,必须在KV存储区中正确比较序列化主键。一种方法是反序列化主键,然后逐列比较。我们将使用另一种方法,让序列化的键字节反映它们的字典顺序,也就是说,键可以按字节进行正确的比较。比
bytes.Compare
较或memcmp
,而不首先对它们进行反序列化。让我们称这种技术为“顺序保持编码”,它可以在不控制底层KV存储的关键字比较功能的情况下使用。对于整数,您可以很容易地看到,无符号大端整数是顺序保持-最重要的位在大端格式的第一位。和以空值结尾的字符串也是保序的。
对于有符号整数,问题是负数具有最有效位(符号位)集。我们需要在大端编码之前翻转符号位,使负数更低。
以空结尾的字符串的问题是它们不能包含空字节。我们将通过“转义”空字节来解决这个问题。
“\x00“
替换为“\x01\x01”
,则转义字节“\x01”
本身替换为“\x01\x02”
,则仍保留排序顺序。范围查询
最后,我们将添加Scanner类型,它允许我们按照排序顺序遍历一系列记录.
初始化迭代器:
移动迭代器:
点查询只是范围查询的特殊情况,那么为什么不去掉它们呢?
我们只允许对完整的主键进行范围查询,但是对主键的前缀进行范围查询也是合法的。我们将在下一章中解决这个问题,以及二级索引。