我有一个列系列,主键定义如下:
...
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) ;
但似乎并不存在。最糟糕的是,也许这完全是愚蠢的,我不明白为什么。
有没有办法实现这个目标?我错过了什么吗?
非常感谢!
答案 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
绝对可以。