【问题标题】:Does cassandra loads whole partition in memory when for a read within partition?在分区内读取时,cassandra 是否将整个分区加载到内存中?
【发布时间】:2016-07-19 13:25:04
【问题描述】:

这个问题很简单,因为我想知道 cassandra 在分区内是如何读取的?它是否从磁盘将整个分区加载到内存中?

如果分区很大会有什么影响?

在分区中读取数据的复杂度是O(Log(N))吗(其中N是分区中的总行数)因为它使用排序映射?

场景:

假设每个分区有 100000 行由唯一的集群键标识。因此,如果我在 fetch 查询中同时提供分区键和集群键,它会将完整的分区加载到内存中以便遍历所有集群键以找到指定的行吗?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    不,它不会读取整个分区。它有一个索引结构。操作系统将缓存读取和写入的文件,如果它有内存的话。因此,如果一个节点有足够的内存,最终该节点上的所有数据都会在内存中。

    【讨论】:

    • 那么你的意思是它对分区中的所有行都有索引吗?如果分区包含大量行,读取性能不会受到影响?
    • @Raedwald 索引结构仅适用于分区键,不适用于集群键。
    • 有两种独立的索引结构:分区索引和分区内的行索引(当分区足够大时)。
    • @TylerHobbs 首先感谢您的回答(我想您是在查看您的个人资料后消除这种困惑的合适人选:P)。我有一个相关的问题,如果我们在分区中有大量的行,那么特定行的获取时间是否会增加,因为我们需要更多的时间在许多索引中搜索正确的索引?
    【解决方案2】:

    据我所知,Cassandra 仅维护分区键而不是集群键的索引和索引摘要文件,因此为了遍历给定分区的所有集群键,它将数据加载到内存中。

    还有另一种理论认为它将在磁盘上执行二进制搜索。

    【讨论】:

    • 这是不正确的。对于大型分区,分区内还有一个行索引。虽然 Cassandra 可能需要读取一些额外的行,但它不必读取整个分区。
    • @TylerHobbs Cassandra 是如何决定这个分区足够大以在分区内维护另一个索引的?
    【解决方案3】:

    我只能找到基于official wiki 中的引用的行缓存

    不确定这是否与之前帖子中提到的 行索引 相同,还是有所不同。

    阅读 wiki 页面后,我假设 Cassandra 确实从 SSTable 读取了整个分区,以防出现行缓存未命中。 当分区位于memtable 时,算法不同:Cassandra 在这些情况下执行二进制搜索。

    如果这个帖子的人能确认一下就好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2017-10-13
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 2020-05-15
      相关资源
      最近更新 更多