6

当涉及到复合列时,我试图了解 Cassandra 的存储引擎。不幸的是,到目前为止我阅读的文档包含错误,让我有点空白。

首先,术语。

复合列使用复合主键包含完全非规范化的宽行。

这似乎具有误导性,因为根据 AFAIK,复合列可以用于复合键,也可以简单地用作键之外的复合列。

1:复合键和列名是如何实现的?我能找到的每个 CQL 示例仅将复合键显示为列,而不是普通的复合列。

假设我们有列'a'、'b'、'c'、'd'作为主复合键+列'e'、'f'。我知道 'a' 将是行和分区键。

让我们假设以下数据:

a    b    c    d    e    f
1a   1b   1c   1d   e1   f1
1a   1b   1c   2d   e1   f2
1a   1b   1c   2d   e2   f3
2a   2b   2c   2d   e2   f4

2:这是如何存储在引擎盖下的?我想这里真正的问题是'b'、'c'、'd' 是如何映射出来的,因为根据定义,列不是分层的。

3:我阅读的文档说不应再使用紧凑型存储。但是如果不需要添加非主键列怎么办......那不使用它的原因是什么?

4

2 回答 2

2

1:复合键和列名是如何实现的?

大多是用问题来回答的2。顺便说一句,在 Cassandra 1.2 中,非复合键也将在底层实现为复合键。此外,复合列的名称本身在存储中不会重复。内存中的表示将名称实习到内存效率的阈值。

2:这是如何存储在引擎盖下的?

第一个关键组件(a在您的示例中)成为物理行键。其余列形成非复合列的前缀,并以预排序(集群)形式存储在一行中。因此,您的示例的物理表示将如下所示:

    1b.1c.1d, e   1b.1c.1d, f
1a      e1            f1
------------------------------
    2b.2c.2d, e   2b.2c.2d, f
2a      e2            f4

请注意,示例中的第二行和第三行无效。列名在物理行中必须是唯一的。

我使用的点符号 ( 1b.1c.1d) 是比喻性的。实际存储使用前缀字节作为元数据,后跟数据。

我阅读的文档说不应再使用紧凑型存储。但是如果不需要添加非主键列怎么办......那不使用它的原因是什么?

非常小的存储效率不值得在架构中没有可进化性的缺点。

于 2012-08-21T02:28:41.923 回答
1

这两个链接可能对您有帮助:

http://www.datastax.com/dev/blog/schema-in-cassandra-1-1

http://xamry.wordpress.com/2012/07/31/composite-keys-in-cassandra

于 2012-08-21T06:25:13.027 回答