最近一直在研究数据库中常见的索引结构,比如B+-trees和LSM。我对点读/写/删除/压缩如何在 LSM 中工作有一个可靠的处理。
例如(在 RocksDB/levelDB 中),在点查询读取时,我们将首先检查内存中的索引(memtable),然后是从最近到最近的一些 SST 文件。在 LSM 的每个级别上,我们将使用二进制搜索来帮助加快查找给定键的每个 SST 文件。对于给定的 SST 文件,我们可以使用布隆过滤器快速检查密钥是否存在,从而节省更多时间。
我没有看到范围读取具体是如何工作的。LSM 是否必须在每个 SST 级别(包括内存表)上打开一个迭代器,并在所有级别上同步迭代,以返回最终排序结果?它是否仅作为一系列点查询实现(几乎肯定不是)。是否所有潜在的键都先被拉出,然后再排序?将不胜感激有人在这里有任何见解。
我无法找到有关该主题的太多文档,任何见解都会在这里有所帮助。