【发布时间】: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
【问题讨论】:
为什么不能按主键排序?
CREATE TABLE "My_Data" (
"SeqNum" bigint,
"ShoeSize" double ,
PRIMARY KEY ("SeqNum")
)
select * "My_Data"
order by "SeqNum"
错误:
仅当分区键受 EQ 或 IN 限制时才支持 ORDER BY
【问题讨论】:
因为 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
这里有几点需要注意:
userid 是分区键,并且行绝对不按其值的顺序排列。
这些值实际上是按分区键的哈希标记值“排序”的,正如您将token 函数应用于userid 列中所见。
该表将posttime 定义为其聚类键,但结果集也不按该列排序。但是,在每个userid 内,结果按posttime 排序。这应该告诉您,您无法在 Cassandra 中对未绑定查询(没有WHERE 子句的查询)的查询结果进行排序。
要在结果集中强制排序,您甚至不需要使用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
如您所见,按分区键进行查询过滤的结果确实按照表定义中定义的降序排列。此外,从多个分区返回数据的查询性能不佳,被视为反模式。
【讨论】: