【发布时间】:2014-07-20 10:33:31
【问题描述】:
我一直在阅读 Cassandra 文档的 this section 并发现以下内容有点令人费解:
确定列开销:
regular_total_column_size = column_name_size + column_value_size + 15
计数器 - expiring_total_column_size = column_name_size + column_value_size + 23
Cassandra 中的每一列都会产生 15 个字节的开销。由于表中的每一行可以具有不同的列名以及不同的列数,因此为每列存储元数据。对于计数器列和即将到期的列,您应该额外添加 8 个字节(总共 23 个字节)。
我对 CQL3 定义的架构的上述解释方式,例如:
CREATE TABLE mykeyspace.mytable(
id text,
report_id text,
subset_id text,
report_date timestamp,
start_date timestamp,
end_date timestamp,
subset_descr text,
x int,
y double,
z int,
PRIMARY KEY (id, report_id, subset_id)
);
是每行将包含列名称的元数据,例如字符串report_date、start_date、end_date 等,以及它们的类型以及数据。但是,我不清楚表中的每一行可以有不同的列名意味着什么。考虑到上面的架构完全是静态的,这对我来说是错误的,也就是说,如果我尝试编写,Cassandra 2.0 肯定会抱怨:
INSERT INTO mykeyspace.mytable (id, report_id , subset_id, x, y, z, w)
VALUES ( 'asd','qwe','rty',100,1.234,12, 123.123);
Bad Request: Unknown identifier w
现在在我看来,鉴于此表架构,列名是固定的,因此元数据不需要按每一行存储。我猜测文档中的措辞已经过时(与 Cassandra 1.2 相同),或者我在这里误解了一些核心概念。
谁能澄清一下?底线:我是否需要担心列名的长度?
我们一直在谨慎行事,并尽可能使用单个字符名称(因此上面的列实际上是i、r、s、dr、ds、de、@987654333 @, ...),但它是如此非人类不可读,使用起来可能会让人困惑。
【问题讨论】:
-
“Cassandra 中的每一列都会产生 15 个字节的开销。” - 这是行的意思,对吗?所以在每一行中,每列有 15 个字节的开销,对吧?
-
@Kozuch 是的,那部分很清楚。
-
我想补充一点,从 Cassandra 3.x 版本开始,我们不再因使用长列名而受到惩罚!但是,对于 Scylla 或其他仍在使用旧版本 SSTable 文件格式的人来说,这可能仍然是个问题。
标签: cassandra cql cql3 cassandra-2.0