Cassandra(或Scylla)如何对聚类列进行排序?

时间:2018-10-27 14:24:19

标签: cassandra scylla

Cassandra(或Scylla)的好处之一是:

  

当一个表具有多个群集列时,数据以嵌套的排序顺序存储。   https://docs.datastax.com/en/dse/6.0/cql/cql/cql_using/whereClustering.html

因此,我认为以相同的排序顺序读回数据应该非常快。

如果写入数据的顺序与群集列指定的顺序不同,那么Cassandra(或Scylla)实际上何时重新排序数据?

将内存表刷新到SSTables时是吗?

如果一个内存表已经被刷新,并且我添加了一条新记录,该记录应该在现有SSTable中的记录之前,该怎么办?

是否会在磁盘上使数据混乱一段时间并在压缩期间重新排序?

如果是,那么需要采取什么步骤来确保读取顺序正确?

2 个答案:

答案 0 :(得分:5)

数据始终以任何给定的sstable排序。

将内存表刷新到磁盘时,这将创建一个新的sstable,并在其内部进行排序。这是自然发生的,因为内存表按排序顺序存储数据,因此此时不需要额外的排序。排序发生在插入到内存表中时。

使用自然排序的读取必须从与该读取相关的所有sstable中读取,将多个排序结果合并为一个排序结果。这种合并发生在内存中。

Compact启动后,将用一个替换多个sstable,从而像常规读取一样创建合并的流。

这种存储数据的技术称为log-structured merge tree

答案 1 :(得分:2)

数据在压缩期间会重新排序。

基本上,任何写入都只是一个追加,以使其非常快。不涉及任何读取或查找。

读取数据时,Cassandra将从活动内存表和一个或多个SSTable中读取。数据被汇总,查询得到满足。

由于数据分发可能需要访问越来越多的SSTable,因此压缩具有重新组织磁盘上数据的作用,因此它将消除从多个SSTable读取数据的潜在开销。值得一提的是,SSTable是不可变的,并且会创建新的SSTable。旧的被丢弃。

Scylla和Cassandra的过程相似。