我很想知道cassandra如何在sstable中组织行的值。
是否存储每一行的列键?
例如
table
c1 int primary key,
c2 int,
c3 int,
insert into table(c1,c2,c3) values(1,2,3)
cassandra如何存储它? 像这样: c1-> 2,3
或类似这样: c1-> c2:2,c3:3
答案 0 :(得分:5)
这很大程度上取决于您使用的Cassandra版本,因为Cassandra组织C * 2.2和C * 3.0之间的数据更改的方式。您可以了解有关这些更改here。在C * 3.0之前,SSTable由分区键及其单元组成。在3.0中,SSTable由分区及其行(包含单元格)组成。
找出数据组织方式的最佳方法是使用sstabledump
(C * 3.0+)或sstable2json
之类的工具来观察执行更新和刷新后磁盘上数据的组织方式到磁盘。
The following article概述了如何使用sstabledump。
对于您建议的模式和插入,这是一个事物外观的示例:
[
{
"partition" : {
"key" : [ "1" ],
"position" : 0
},
"rows" : [
{
"type" : "row",
"position" : 32,
"liveness_info" : { "tstamp" : "2018-09-06T00:03:38.558182Z" },
"cells" : [
{ "name" : "c2", "value" : 2 },
{ "name" : "c3", "value" : 3 }
]
}
]
}
]
如您所见,数据是按分区组织的,然后在分区内有行。每行中都有一个单元格,每个单元格代表一个列值。
在分区,行和单元格级别还可以存在其他元数据。 C * 3存储引擎还通过不将每个列的名称存储在每个单元格中(C * 2这样做的地方)来优化空间。