范围查询如何在 LSM(日志结构合并树)上工作?
how do range queries work on a LSM (log structure merge tree)?
最近在研究数据库中常用的索引结构,比如B+树、LSM。我对 reads/writes/deletes/compaction 点在 LSM 中的工作方式有很好的把握。
例如(在 RocksDB/levelDB 中),在读取点查询时,我们将首先检查内存中的索引 (memtable),然后是从最近到最近的一些 SST 文件。在 LSM 的每个级别上,我们将使用二进制搜索来帮助加快查找给定密钥的每个 SST 文件。对于给定的 SST 文件,我们可以使用布隆过滤器来快速检查密钥是否存在,从而进一步节省我们的时间。
我看不到范围读取的具体工作原理。 LSM 是否必须在每个 SST 级别(包括内存表)上打开一个迭代器,并在所有级别上同步迭代,以 return 最终排序结果?它是否仅作为一系列点查询实现(几乎肯定不是)。是否所有潜在的键都先被拉出然后再排序?非常感谢有人在这里有任何见解。
我没能找到很多关于这个主题的文档,任何见解在这里都会有所帮助。
RocksDB 有多种迭代器实现,如 Memtable Iterator、File Iterator、Merging Iterator 等。
在范围读取期间,迭代器将使用 SeekTo()
调用寻找起始范围,类似于点查找(在 SST 中使用二进制搜索)。在寻求开始范围之后,将会有一系列迭代器为每个 memtable 创建一个,为每个 Level-0 文件创建一个(因为 L0 中 SST 的重叠性质),然后为每个级别创建一个。合并迭代器将从这些迭代器中的每一个中收集键,并按排序顺序提供数据,直到达到结束范围。
请参阅有关迭代器实现的 this 文档。
最近在研究数据库中常用的索引结构,比如B+树、LSM。我对 reads/writes/deletes/compaction 点在 LSM 中的工作方式有很好的把握。
例如(在 RocksDB/levelDB 中),在读取点查询时,我们将首先检查内存中的索引 (memtable),然后是从最近到最近的一些 SST 文件。在 LSM 的每个级别上,我们将使用二进制搜索来帮助加快查找给定密钥的每个 SST 文件。对于给定的 SST 文件,我们可以使用布隆过滤器来快速检查密钥是否存在,从而进一步节省我们的时间。
我看不到范围读取的具体工作原理。 LSM 是否必须在每个 SST 级别(包括内存表)上打开一个迭代器,并在所有级别上同步迭代,以 return 最终排序结果?它是否仅作为一系列点查询实现(几乎肯定不是)。是否所有潜在的键都先被拉出然后再排序?非常感谢有人在这里有任何见解。
我没能找到很多关于这个主题的文档,任何见解在这里都会有所帮助。
RocksDB 有多种迭代器实现,如 Memtable Iterator、File Iterator、Merging Iterator 等。
在范围读取期间,迭代器将使用 SeekTo()
调用寻找起始范围,类似于点查找(在 SST 中使用二进制搜索)。在寻求开始范围之后,将会有一系列迭代器为每个 memtable 创建一个,为每个 Level-0 文件创建一个(因为 L0 中 SST 的重叠性质),然后为每个级别创建一个。合并迭代器将从这些迭代器中的每一个中收集键,并按排序顺序提供数据,直到达到结束范围。
请参阅有关迭代器实现的 this 文档。