19

在给定的物理节点上,给定分区键的行按由集群键引起的顺序存储,使得以该集群顺序检索行特别有效。http://cassandra.apache.org/doc/cql3/CQL.html#createTableStmt聚类键会引发什么样的排序?

4

1 回答 1

40

假设您的聚类键是

k1 t1, k2 t2, ..., kn tn

其中 ki 是第 i 个键名,ti 是第 i 个键类型。然后订单数据以字典顺序存储,其中每个维度都使用该类型的比较器进行比较。

所以 (a1, a2, ..., an) < (b1, b2, ..., bn) 如果 a1 < b1 使用 t1 比较器,或者 a1=b1 和 a2 < b2 使用 t2 比较器,或者 (a1=b1 和a2=b2) 和 a3 < b3 使用 t3 比较器等。

这意味着找到具有特定 k1=a 的所有行是有效的,因为数据存储在一起。但是在 i > 1 时查找所有具有 ki=x 的行是低效的。事实上,这样的查询是不允许的 - 唯一允许的集群键约束指定零个或多个集群键,从第一个开始,没有丢失.

例如,考虑架构

create table clustering (
    x text,
    k1 text,
    k2 int,
    k3 timestamp,
    y text,
    primary key (x, k1, k2, k3)
);

如果你做了以下插入:

insert into clustering (x, k1, k2, k3, y) values ('x', 'a', 1, '2013-09-10 14:00+0000', '1');
insert into clustering (x, k1, k2, k3, y) values ('x', 'b', 1, '2013-09-10 13:00+0000', '1');
insert into clustering (x, k1, k2, k3, y) values ('x', 'a', 2, '2013-09-10 13:00+0000', '1');
insert into clustering (x, k1, k2, k3, y) values ('x', 'b', 1, '2013-09-10 14:00+0000', '1');

然后它们按此顺序存储在磁盘上(顺序select * from clustering where x = 'x'返回):

 x | k1 | k2 | k3                       | y
---+----+----+--------------------------+---
 x |  a |  1 | 2013-09-10 14:00:00+0000 | 1
 x |  a |  2 | 2013-09-10 13:00:00+0000 | 1
 x |  b |  1 | 2013-09-10 13:00:00+0000 | 1
 x |  b |  1 | 2013-09-10 14:00:00+0000 | 1

k1排序占主导地位,则k2,则k3

于 2013-09-05T12:55:21.370 回答