在cassandra中拥有多个集群密钥有什么好处?

时间:2014-01-26 16:11:33

标签: nosql cassandra data-modeling

根据blog

  

ORDER BY子句只能选择一个列,该列必须是复合PRIMARY KEY中的第二列。即使对于主键中具有两个以上列组件的表,这也成立。订购可以按升序或降序进行,默认升序,并使用ASC或DESC关键字指定。

复合PRIMARY KEY中的第二列表示第一个群集密钥。如果ORDER BY列必须是复合PRIMARY KEY中的第二列,那么拥有多个群集密钥有什么好处?

1 个答案:

答案 0 :(得分:3)

要记住的一件事是群集键列也是主键列。大多数情况下,您需要引入其他键列(也恰好是群集列),这不是因为它们为您提供了更多的排序灵活性,而只是为了能够存储更多唯一的行。

考虑到这一点,如果你引入额外的群集密钥列,能够利用它们进行结果排序和范围查询。

考虑下表:

CREATE TABLE table4 (col1 int, col2 int, col3 int, col4 text, PRIMARY KEY (col1, col2, col3));

1)跨多个列进行聚类意味着您可以发出复合范围查询,例如:

 cqlsh:ks> SELECT * FROM table4 WHERE col1=1 AND col2=2 AND col3 > 1;

 col1 | col2 | col3 | col4
------+------+------+------
    1 |    2 |    2 |  122
    1 |    2 |    3 |  123

 (2 rows)

2)至于按多列排序(博客帖子声称你不能做什么):你可以实际上这样做:

cqlsh:ks> SELECT * FROM table4 WHERE col1=3 ORDER BY col2 DESC, col3 DESC;

 col1 | col2 | col3 | col4
------+------+------+------
    3 |    3 |    3 |  333
    3 |    3 |    2 |  332
    3 |    3 |    1 |  331
    3 |    2 |    3 |  323
    3 |    2 |    2 |  322
    3 |    2 |    1 |  321
    3 |    1 |    3 |  313
    3 |    1 |    2 |  312
    3 |    1 |    1 |  311

(9 rows)

但是有一个问题。不允许查询引擎重新排序行的任何超出简单反向的内容。所以以下方法不起作用,因为它需要进行非平凡的排序:

cqlsh:ks> SELECT * FROM table4 WHERE col1=3 ORDER BY col2 DESC, col3 ASC;
Bad Request: Unsupported order by relation

换句话说,查询引擎只能处理两种可能的顺序:自然或反向。要指定您想要的两个中的哪一个,您永远不会需要为ORDER BY指定多个列。因此,像这样的查询将返回与上面的查询完全相同的结果集(#2):

cqlsh:ks> SELECT * FROM table4 WHERE col1=3 ORDER BY col2 DESC;

 col1 | col2 | col3 | col4
------+------+------+------
    3 |    3 |    3 |  333
    3 |    3 |    2 |  332
    3 |    3 |    1 |  331
    3 |    2 |    3 |  323
    3 |    2 |    2 |  322
    3 |    2 |    1 |  321
    3 |    1 |    3 |  313
    3 |    1 |    2 |  312
    3 |    1 |    1 |  311

(9 rows)