Недавно я изучал общие структуры индексации в базах данных, такие как B + -деревья и LSM. У меня есть твердое представление о том, как точка чтения / записи / удаления / сжатия будет работать в LSM.
Например, (в RocksDB / levelDB) при чтении точечного запроса мы сначала проверяем индекс в памяти (memtable), а затем некоторое количество файлов SST, начиная с самых последних и заканчивая самыми последними. На каждом уровне в LSM мы будем использовать бинарный поиск, чтобы ускорить поиск каждого файла SST для данного ключа. Для данного файла SST мы можем использовать фильтры Блума, чтобы быстро проверить, существует ли ключ, что сэкономит нам время.
Чего я не вижу, так это того, как именно работает диапазон чтения. Должен ли LSM открывать итератор на каждом уровне SST (включая memtable) и выполнять итерацию по всем уровням для получения окончательного отсортированного результата? Реализовано ли это как просто серия точечных запросов (почти наверняка нет). Все ли потенциальные ключи сначала извлекаются, а затем сортируются? Буду признателен за любые идеи, которые кто-то имеет здесь.
Я не смог найти много документации по этому вопросу, любая информация была бы полезна здесь.