在cassandra的查询语言级别上是否存在宽行、分区、集群列/键和分区键的概念?

snvhrwxg  于 2021-06-10  发布在  Cassandra
关注(0)|答案(2)|浏览(325)

在cassandra中,宽行、分区、集群列/键和分区键的概念是否存在于查询语言级别?还是查询语言的用户不知道的内部实现问题?
下面是一个如何理解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 对于partiton键 test :

SELECT * from test where a='test' and b=1

谢谢。

b09cbbtk

b09cbbtk1#

毫无疑问,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中,宽行得到了适当的支持,这是有限的(从真正巨大的分区读取数据可能会比较慢,而且各种代码仍然以低效的方式处理它们)。像这样的一些文档建议cassandra分区的理想大小应该达到10mb。

55ooxyrt

55ooxyrt2#

cql模式

基于表架构,如下所示:

Create TABLE test (a text,b int, c text, PRIMARY KEY(a,b))

分区密钥由“a”和“b”组成。我认为下面的文章将解决您关于分区键等的所有问题:在cassandra中分区键、复合键和集群键之间的区别?

数据文件

分区和集群列等都存在于数据文件级别(因此在数据库)。在内部,这是由cassandras存储引擎理解的。使用您的示例,我创建了表,刷新了键空间,并使用 sstablemetadata 注意,您必须以cassandra运行的用户身份运行该工具(在我的例子中,它是 cassandra 用户:

$ sudo -u cassandra sstabledump /var/lib/cassandra/data/mc/test-bedc4ba012cf11ea93f72f6848f9d70d/md-1-big-Data.db

[
  {
    "partition" : {
      "key" : [ "test" ],
      "position" : 0
    },
    "rows" : [
      {
        "type" : "row",
        "position" : 37,
        "clustering" : [ 1 ],
        "liveness_info" : { "tstamp" : "2019-11-29T17:43:35.752796Z" },
        "cells" : [
          { "name" : "c", "value" : "test1" }
        ]
      },
      {
        "type" : "row",
        "position" : 37,
        "clustering" : [ 2 ],
        "liveness_info" : { "tstamp" : "2019-11-29T17:43:31.144961Z" },
        "cells" : [
          { "name" : "c", "value" : "test2" }
        ]
      }
    ]
  },
  {
    "partition" : {
      "key" : [ "test-new" ],
      "position" : 54
    },
    "rows" : [
      {
        "type" : "row",
        "position" : 95,
        "clustering" : [ 1 ],
        "liveness_info" : { "tstamp" : "2019-11-29T17:43:41.438779Z" },
        "cells" : [
          { "name" : "c", "value" : "test1" }
        ]
      }
    ]
  }
]

我们可以清楚地看到键“test”分别有两个值为“1”和“2”的聚类行。
有关存储引擎的更多背景信息,请参见:https://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlmanageondisk.html

宽行

与其说这是您决定使用或实现的东西,不如说它是坏数据模型的副作用。一个很好的例子是假设你有一张这样的table:

CREATE TABLE mc.cars (
    owner_id int PRIMARY KEY,
    car_reg text,
    owner_name text,
    price float,
    purchased date
);

虽然这个模型可能还可以,但是想象一下你有一个(幸运的!)拥有超过1000辆汽车的车主。除了一个大车库,他们也可能是一个广泛的争吵的原因。如果你的table看起来像这样:

CREATE TABLE mc.cars2 (
    owner_id int,
    car_reg text,
    owner_name text,
    price float,
    purchased date,
    PRIMARY KEY (owner_id, car_reg)
) WITH CLUSTERING ORDER BY (car_reg ASC)

你将不太可能看到一个宽行,因为你的分区键是由汽车登记号码太。

相关问题