要记住的一点是集群键列也是主键列。大多数情况下,您会希望引入额外的键列(也恰好是集群列),不是因为它们为您提供了更大的排序灵活性,而是为了能够存储更多唯一的行。
考虑到这一点,如果您确实引入了额外的集群键列,您将能够利用它们进行结果排序和范围查询。
考虑这张表:
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)