Cassandra(或Scylla)的好处之一是:
当一个表具有多个群集列时,数据以嵌套的排序顺序存储。 https://docs.datastax.com/en/dse/6.0/cql/cql/cql_using/whereClustering.html
因此,我认为以相同的排序顺序读回数据应该非常快。
如果写入数据的顺序与群集列指定的顺序不同,那么Cassandra(或Scylla)实际上何时重新排序数据?
将内存表刷新到SSTables时是吗?
如果一个内存表已经被刷新,并且我添加了一条新记录,该记录应该在现有SSTable中的记录之前,该怎么办?
是否会在磁盘上使数据混乱一段时间并在压缩期间重新排序?
如果是,那么需要采取什么步骤来确保读取顺序正确?
答案 0 :(得分:5)
数据始终以任何给定的sstable排序。
将内存表刷新到磁盘时,这将创建一个新的sstable,并在其内部进行排序。这是自然发生的,因为内存表按排序顺序存储数据,因此此时不需要额外的排序。排序发生在插入到内存表中时。
使用自然排序的读取必须从与该读取相关的所有sstable中读取,将多个排序结果合并为一个排序结果。这种合并发生在内存中。
Compact启动后,将用一个替换多个sstable,从而像常规读取一样创建合并的流。
这种存储数据的技术称为log-structured merge tree。
答案 1 :(得分:2)
数据在压缩期间会重新排序。
基本上,任何写入都只是一个追加,以使其非常快。不涉及任何读取或查找。
读取数据时,Cassandra将从活动内存表和一个或多个SSTable中读取。数据被汇总,查询得到满足。
由于数据分发可能需要访问越来越多的SSTable,因此压缩具有重新组织磁盘上数据的作用,因此它将消除从多个SSTable读取数据的潜在开销。值得一提的是,SSTable是不可变的,并且会创建新的SSTable。旧的被丢弃。
Scylla和Cassandra的过程相似。