Cassandra CQL - 具有多个聚类列的聚类顺序

时间:2014-02-27 18:43:50

标签: cassandra cql cql3 cqlsh

我有一个列系列,主键定义如下:

...
PRIMARY KEY ((website_id, item_id), user_id, date)

将使用以下查询进行查询:

SELECT * FROM myCF
WHERE website_id = 30 AND item_id = 10
AND user_id = 0 AND date > 'some_date' ;

但是,我想保留我的列系列仅按日期排序,例如SELECT date FROM myCF ;将返回最近插入的日期。

由于聚类列的顺序,我得到的是每个user_id的订单,然后是每个日期。 如果我将主键定义更改为:

PRIMARY KEY ((website_id, item_id), date, user_id)

我不能再运行相同的查询,因为必须限制日期是user_id is。

我认为可能有某种说法:

...
  PRIMARY KEY ((website_id, shop_id), store_id, date)
) WITH CLUSTERING ORDER BY (store_id RANDOMPLEASE, date DESC) ;

但似乎并不存在。最糟糕的是,也许这完全是愚蠢的,我不明白为什么。

有没有办法实现这个目标?我错过了什么吗?

非常感谢!

3 个答案:

答案 0 :(得分:8)

您的查询示例限制user_id,以便使用第二种表格式。但是如果你真的试图运行像

这样的查询
SELECT * FROM myCF
WHERE website_id = 30 AND item_id = 10
AND date > 'some_date'

然后你需要一个额外的表来创建来处理这些查询,它只会在日期而不是在用户ID上订购

Create Table LookupByDate ... PRIMARY KEY ((website_id, item_id), date)

答案 1 :(得分:1)

除了您的主查询之外,如果您尝试获取的是"返回最近插入的日期",您可能不需要额外的表格。您可以使用"静态列"存储每个分区的最后更新时间。 CASSANDRA-6561

答案 2 :(得分:0)

这可能无法解决您的特殊情况(因为我想您的所有用户列表都过大),但是如果第一类聚类列中的条件与一组相对较小的值匹配,则可以使用{ {1}}。

IN

请勿在分区键上使用SELECT * FROM myCF WHERE website_id = 30 AND item_id = 10 AND user_id IN ? AND date > 'some_date' ,因为这将创建效率低下的查询,该查询会打到多个节点,从而给协调节点带来压力。而是并行执行多个异步查询。但是在 clustering 列上的IN绝对可以。