2016-08-19 58 views

回答

4

因为卡桑德拉仅支持结果集订货通过聚类键和分区键。在你的情况下,"SeqNum"是你的分区密钥,你没有定义一个集群密钥。我去年写了article describing this functionality for Planet Cassandra。下面的文章中我的第二个例子,考虑这个表定义:

CREATE TABLE postsbyuser (
    userid bigint, 
    posttime timestamp, 
    postid uuid, 
    postcontent text, 
    PRIMARY KEY ((userid), posttime) 
) WITH CLUSTERING ORDER BY (posttime DESC); 

如果我INSERT六行,然后查询表:

> SELECT userid, token(userid), posttime FROM postsbyuser; 

userid | token(userid)  | posttime 
--------+----------------------+-------------------------- 
     1 | -4069959284402364209 | 2015-01-25 13:25:00-0600 
     1 | -4069959284402364209 | 2015-01-25 13:22:00-0600 
     0 | -3485513579396041028 | 2015-01-25 13:21:00-0600 
     2 | -3248873570005575792 | 2015-01-25 13:28:00-0600 
     2 | -3248873570005575792 | 2015-01-25 13:27:00-0600 
     2 | -3248873570005575792 | 2015-01-25 13:26:00-0600 

有几件事情,这里要注意:

  1. userid是分区键,并且按其值按顺序决定地排而不是

  2. 值实际上是“排序”,由散列令牌值的分区键,你可以从应用token功能的userid栏中看到。

  3. 该表将posttime定义为其集群键,但结果集并未按该列排序。但是,在每个userid内,结果,订购者为posttime。这应该告诉你,你在不能在一个未绑定的查询(查询没有WHERE子句)中对Cassandra的查询结果进行排序。

  4. 要强制执行结果集中的排序顺序,您甚至不需要使用ORDER BY子句。

如果我想通过自己的岗位时间排序的职位,我将需要提供(在这种情况下)的ID为特定用户:

> SELECT userid, token(userid), posttime 
FROM postsbyuser 
WHERE userid=2; 

userid | token(userid)  | posttime 
--------+----------------------+-------------------------- 
     2 | -3248873570005575792 | 2015-01-25 13:28:00-0600 
     2 | -3248873570005575792 | 2015-01-25 13:27:00-0600 
     2 | -3248873570005575792 | 2015-01-25 13:26:00-0600 

正如你所看到的,结果一按分区键的查询过滤确实是按照在表定义中定义的降序顺序进行的。而且,从多个分区返回数据的查询是非高性能的,并且被认为是反模式。

相关问题