Cassandra 1.1 存储引擎如何存储复合材料?
Posted
技术标签:
【中文标题】Cassandra 1.1 存储引擎如何存储复合材料?【英文标题】:Cassandra 1.1 storage engine how does it store composites? 【发布时间】:2012-08-12 06:49:36 【问题描述】:当涉及到复合列时,我试图了解 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:我阅读的文档说不应再使用紧凑型存储。但是如果不需要添加非主键列怎么办……那有什么理由不使用呢?
【问题讨论】:
【参考方案1】: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
) 是比喻性的。实际存储使用前缀字节作为元数据,后跟数据。
我阅读的文档说不应再使用紧凑型存储。但是如果不需要添加非主键列怎么办……那有什么理由不使用呢?
非常小的存储效率不值得在您的架构中没有可进化性的缺点。
【讨论】:
“非复合键”是什么意思?确定一个键是 1 个组件(无列)还是复合(1 个键和复合列)?【参考方案2】:这两个链接可能对您有所帮助:
http://www.datastax.com/dev/blog/schema-in-cassandra-1-1
http://xamry.wordpress.com/2012/07/31/composite-keys-in-cassandra
【讨论】:
以上是关于Cassandra 1.1 存储引擎如何存储复合材料?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中的 Cassandra 中注释/使用复合分区键?
如何按数据范围查询 Cassandra 中以 TimeUUID 为第一个组件的复合列?