我们在cassandra中使用了一个非常简单的键值数据模型,分区键在17个sstables中。我想了解read在我们的具体案例中是如何工作的。
如果我理解正确,那么general cassandra reads将需要搜索memtable和不同sstable中每个列的最新版本,直到它检索所有列并合并它们。
由于sstable是按时间排序的,并且我们的数据模型是单列的,因此理想情况下,我们的读取操作应该只命中包含分区键的最新sstable,因为它将包含整个数据。
我们的读取操作会击中17个sstables吗?或者只是最新的一个包含搜索的分区键?
2条答案
按热度按时间ar5n3qh51#
cassandra将搜索所有列,因为它不确定哪些列存在于何处(dml发生在单元格级别,因此,执行协调的地方可能存在变体)。读取是在分区级别完成的。但是,如果cassandra知道分区键在某些表中不存在,它可以过滤掉sstables。这就是为什么压缩对于优化读取非常重要的原因—删除不必要的单元。
vc9ivgsu2#
我们的读取操作会击中17个sstables吗?或者只是最新的一个包含搜索的分区键?
为了补充吉姆的答案,Cassandra有一种叫做布鲁姆过滤器的东西。本质上,它是一个概率结构,可以告诉你两件事之一:
sstable可能包含请求的数据。
或
sstable肯定不包含请求的数据。
这应该可以防止cassandra扫描所有17个sstable。我的建议是用
TRACING ON
在cqlsh中,它会告诉您需要查看多少个sstables。