首页 文章

Cassandra:分区键是否也用于聚类?

提问于
浏览
1

假设我有一个这样的主键: primary key (PK, CK) .

根据我读到的内容(参见参考资料),我想我可以松散地描述Cassandra使用 PKCK 的方式如下 - PK 将用于决定数据应该去哪个节点, CK 将用于聚类(该节点内的数据也称为“排序” .

然后,似乎 PK 不用于聚类节点内的数据,这听起来是错误的 . 如果我只有 PK 的简单主要内容怎么办?由于没有聚类列,Cassandra是否只在节点之间分配数据而不是在每个节点内订购数据?

裁判:

2 回答

  • 2

    然后,似乎PK不用于聚类节点内的数据,这听起来是错误的 . 如果我有一个只有PK的简单主要怎么办?由于没有聚类列,Cassandra是否只在节点之间分配数据而不是在每个节点内订购数据?

    好问题 . 让's try this out. I' ll创建一个简单的表和 INSERT 一些数据:

    aploetz@cqlsh:stackoverflow> CREATE TABLE programs 
                                 (name text PRIMARY KEY, data text);
    aploetz@cqlsh:stackoverflow> INSERT INTO programs (name) VALUES ('Tron');
    aploetz@cqlsh:stackoverflow> INSERT INTO programs (name) VALUES ('Yori');
    aploetz@cqlsh:stackoverflow> INSERT INTO programs (name) VALUES ('Quorra');
    aploetz@cqlsh:stackoverflow> INSERT INTO programs (name) VALUES ('Clu');
    aploetz@cqlsh:stackoverflow> INSERT INTO programs (name) VALUES ('Flynn');
    aploetz@cqlsh:stackoverflow> INSERT INTO programs (name) VALUES ('Zuze');
    

    现在,让我们运行一个应该回答您问题的查询:

    aploetz@cqlsh:stackoverflow> SELECT name, token(name) FROM programs;
    
     name   | system.token(name)
    --------+----------------------
      Flynn | -1059892732813900311
       Zuze |  1815531347795840810
       Yori |  2854211700591734382
     Quorra |  3079126743186967718
       Tron |  6359222509420865788
        Clu |  8304850648940574176
    
    (6 rows)
    

    正如你所看到的,它们肯定不是 name 的顺序,它是分区键和单独的PRIMARY KEY . 但是,我的查询在 name 上运行 token() 函数,该函数显示分区键的散列值(在本例中为 name ) . 结果按此排序 .

    因此,为了回答您的问题,Cassandra通过分区键的散列值对其分区进行排序 . 请注意,此顺序在整个群集中维护,而不仅仅在单个节点上维护 . 因此,无论群集中的节点数是多少,都将按分区键的散列值对未绑定查询(不建议在多节点配置中运行)的结果进行排序 .

  • 1

    由于表的所有数据都将通过分区键的顺序写入相同的SSTable . 所以是的,他们是排序的 .

    我想你所问的是为什么你不能像使用群集密钥一样使用主键 . 例如,您不能在分区键上执行少于(<)或大于(>)的操作 . 由于一个节点没有所有分区键,因此这种类型的查询必须检查群集中的所有节点,以查看它们是否具有与您的查询匹配的任何分区键 .

相关问题