我的用例
我想通过时间戳DESC订购结果。但我不希望时间戳成为主键中的第二列,因为这将取决于我的查询功能
例如
create table demo(oid int,cid int,ts timeuuid,PRIMARY KEY (oid,cid,ts)) WITH CLUSTERING ORDER BY (ts DESC);
需要查询:
I want the result for all the below queries to be in DESC order of timestamp
select * from demo where oid = 100;
select * from demo where oid = 100 and cid = 10;
select * from demo where oid = 100 and cid = 100 and ts > minTimeuuid('something');
我正在尝试使用CLUSTERING ORDER IN CQL创建此表并收到此错误
cqlsh:v> create table demo(oid int,cid int,ts timeuuid,PRIMARY KEY (oid,cid,ts)) WITH CLUSTERING ORDER BY (ts desc);
Bad Request: Missing CLUSTERING ORDER for column cid
在本文档中,它提到我们可以使用多个键来进行群集排序。谁知道怎么做?
答案 0 :(得分:10)
CREATE TABLE example ( a int, b int, c int, d int, PRIMARY KEY (a,b,c)) WITH CLUSTERING ORDER BY (b DESC , c ASC ) ;
是使用多列排序的正确语法。
对于您的特定应用程序,您实际上是尝试从截然不同类型的查询中获取结果。在Cassandra中,最好将每个表格整形为对特定查询的响应。
例如(不太了解您的申请)
select * from demo where oid = 100 and cid = 100 and ts > minTimeuuid('something');
select * from demo where oid = 100 and cid = 10;
可以通过像
这样的表结构更好地服务create table demo_oct(oid int,cid int,ts timeuuid, body, other ...., PRIMARY KEY ((oid,cid),ts)) WITH CLUSTERING ORDER BY (ts DESC);
这样,一对oid和cid数据的每组时间序列都将驻留在它自己的分区中,并且易于检索。这是因为我使用的是由oid和cid组成的Parition键。这就是密钥中有一组额外的括号。群集密钥ts确保数据按您想要的顺序排列。
但正如您所注意到的,您无法在此表上执行select * from table oid == 10,因为这需要扫描整个数据库(因为分区结构)
对于像
这样的查询从演示中选择*,其中oid = 100;
你需要第二张桌子(再次不知道你的特定申请)
create table demo_ot(oid int,cid int,ts timeuuid, body, other ...., PRIMARY KEY (oid,ts)) WITH CLUSTERING ORDER BY (ts DESC);
此表将在单个分区中保留每个OID的时间序列,从而允许极快的切片。这里的分区键只是OID,而ts仍然是集群键。
在应用程序端,您将同时插入这两个表。