Почему фильтры Блума не могут обрабатывать запросы диапазона?

Контекст: я читаю о деревьях RocksDB и LSM, насколько я понимаю, фильтр Bloom используется, чтобы избежать множественных операций ввода-вывода для извлечения элементов на всех уровнях хранения. И я в порядке с этим.

Очевидно, одна из проблем заключается в том, что фильтр Блума нельзя использовать в запросах диапазона. Какова причина? Если я хочу проверить, есть ли ключ между 32 и 200, я могу сделать поиск по одному ключу для каждого значения между (или остановиться на первом "истинном" ответе). Это действительно неэффективно?

1 ответ

Решение

Вы можете сделать это, но это неэффективно, потому что поиск в одной точке медленен (даже с фильтрами Блума) по сравнению с поиском первого значения (32) и итерацией к 200. Leveldb/rocksdb оптимизирован для таких итераций.

Кроме того, в вашем случае вам просто нужен любой первый ключ между 32 и 200 - вы просто делаете один поиск, и все, в противном случае вам придется делать в худшем случае 200-32 = 168 поисков. Фильтр Блума может быстро ответить, нет ли ключа, если нет столкновений, но он все еще требует поиска диска, если он есть.

Другие вопросы по тегам