我知道 leveldb/cassandra 将他们的记录存储在 SSTable 中,并使用布隆过滤器在执行精确键查询时选择 SSTable,他们的布隆过滤器是否有助于键范围查询?
3 回答
Cassandra 中有两种类型的范围查询:get_slice,它在一行中查找一系列列;get_range_slices,它从一系列行中查找一系列列。
get_slice 中使用布隆过滤器来定位行。但是在 get_range_slices 查询中不使用布隆过滤器。但是,由于 Cassandra 键是按哈希顺序存储的,因此 get_range_slices 并不是很有用,因此必须扫描所有 SSTable 以执行 get_range_slices 查询通常并不重要。
在进行范围查询之前,了解什么是布隆过滤器很重要?
布隆过滤器是概率集,允许您用内存换取准确性,或者是一种节省空间的概率数据结构,用于测试元素是否是集合的成员。
Cassandra 在执行密钥查找时使用布隆过滤器来节省 IO,并且您知道每个 SSTable 都有一个与之关联的布隆过滤器,Cassandra 在进行任何磁盘搜索之前都会对其进行检查。现在考虑没有布隆过滤器的情况,每次读取密钥都必须读取每个 sstable,这非常昂贵。通过使用布隆过滤器,cassandra 几乎总是只需要查看包含该键数据的 sstables。
因此,每当执行范围查询时,布隆过滤器都会发挥重要作用。在 get_slice 类型的范围查询中,它将有助于识别确切的行,而在 get_range_slices 中,它将有助于找到负责的概率键集。
理查德回答布隆过滤器端;填写第一部分:是的,LeveledCompactionStrategy 通常会导致更快的扫描(通过 PK 或索引),因为数据行的写入端合并更积极。