【问题标题】:Why can't I sort by the primary key in CQL?为什么我不能在 CQL 中按主键排序?
【发布时间】:2016-12-26 15:38:55
【问题描述】:

为什么不能按主键排序?

CREATE TABLE "My_Data" (    
    "SeqNum" bigint,
    "ShoeSize" double ,   

    PRIMARY KEY ("SeqNum")    
)

select * "My_Data"
order by "SeqNum"

错误:

仅当分区键受 EQ 或 IN 限制时才支持 ORDER BY

【问题讨论】:

    标签: c# cassandra


    【解决方案1】:

    因为 Cassandra 仅支持 集群键和 within 分区键的结果集排序。在您的情况下,"SeqNum" 是您的分区键,并且您没有定义集群键。

    我去年写了一个article describing this functionality。按照我在文章中的第二个示例,考虑这个表定义:

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

    如果我要插入六行然后查询表:

    > 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 排序。这应该告诉您,您无法在 Cassandra 中对未绑定查询(没有WHERE 子句的查询)的查询结果进行排序。

    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
    

    如您所见,按分区键进行查询过滤的结果确实按照表定义中定义的降序排列。此外,从多个分区返回数据的查询性能不佳,被视为反模式。

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      相关资源
      最近更新 更多