我对 Cassandra 中的全表扫描感兴趣。它们不是我的数据库设计的关键部分,但我确实偶尔需要它们,并希望确保我了解性能影响。
假设我已经订购了键并且正在使用合理的有序分区器。我也在使用不可变数据,如果这会有所不同(数据库实际上是仅附加的)。
现在,据我了解,插入会进入 memtable,然后每隔一段时间就会刷新到磁盘上的 SSTable 文件中,该文件将按排序顺序包含 memtable 的所有行。磁盘会累积一堆这些 SSTable 文件,然后这些文件会定期合并/压缩(保持排序)到一个文件中。
我假设在相当多的写入环境中,在任何给定时间,磁盘上都会有几个未合并的 SSTable 文件。
现在,当我使用Cassandra 中似乎被接受的方式执行分页“表扫描”时,我实际上是在按顺序要求键。这意味着,Cassandra 不能只从 SSTables 中批量输出内容,而是需要在每个表中维护指向我当前位置的指针,通过我的键顺序查看哪个是最低的,然后将其返回给我。据我了解,这将导致非常“跳跃”的磁盘访问模式,通常不会在任何具有昂贵寻道的介质上表现良好。当集群中有多个节点时,这个问题可能会加剧。
对于我的用例来说,理想的情况是能够说我不关心我取回行的顺序,只要我得到它们。然后 Cassandra 可以使用磁盘的批量读取向我发送大块行,而不必担心按顺序提供它们。
我想这个“问题”真的可以归结为:我对上面说明的事情如何运作的理解正确吗?如果是这样,我能做些什么来使这种扫描更愉快吗?我对这个问题的综合只是 Cassandra 可以通过另一个 API 调用以任何顺序请求 N 行,并带有某种指示我在哪里,以便我未来的请求可以从那里恢复。在许多方面,它与现有范围调用中使用的模式相同,但关键(对于性能)是我不关心顺序。