在Cassandra中,宽行,分区,集群列/键和分区键的概念是否存在于查询语言级别?还是它们是查询语言的用户不了解的内部实现问题?
这里是How to understand the concept of wide row and related concepts in Cassandra?中的示例。在查询语言的命令中,以上概念似乎并不存在,但在钩子中确实存在。
考虑一个以
a
作为分区键,以b
作为聚类列创建的表:Create TABLE test (a text,b int, c text, PRIMARY KEY(a,b)) INSERT INTO test(a,b,c) VALUES('test',2,'test2') INSERT INTO test(a,b,c) VALUES('test',1,'test1') INSERT INTO test(a,b,c) VALUES('test-new',1,'test1')
如果您以上述顺序运行上述查询,cassandra会将数据存储在以下顺序(只需检查
b
列的顺序):test -> [b:1,c=test1] [b:2,c=test2] test-new -> [b:1,c=test1]
用
b:1
来分配分区键test
的单元:SELECT * from test where a='test' and b=1
谢谢。
绝对-CQL语法确实具有分区键与群集键的概念。只需查看您提供的示例:
Create TABLE test (a text,b int, c text, PRIMARY KEY(a,b))
语法(a,b)
在CQL中表示a
是分区键,而b
是集群键。再举一个例子,如果您要写((a,b,c),d,e,f)
,则表示a
,b
和c
是分区键列,而d
,e
和f
是聚簇键列。这是CQL语法。
这实际上意味着什么,我想你知道。除其他事项外,您可以要求以某种已知的排序顺序获取属于单个分区的所有聚类行-但是未对分区进行排序,并且全表扫描以随机顺序返回它们。]
CQL中未使用术语“宽行”作为术语,但确实存在该概念,正如我在上文中解释的那样,当单个单个行发生时,会发生“宽行”(实际上,“宽分区”更为准确)分区具有很多群集行-即,同一分区键有很多不同的群集键。在Cassandra中,对宽行的支持是有限的(从真正大的分区读取可能会比较慢,并且各种代码段仍然以低效的方式处理它们)。某些文件,例如this,建议Cassandra分区的大小最好为10MB。