6

我有一个主键定义如下的列族:

...
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 是。

我想可能有一些方法可以说:

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

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

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

非常感谢!

4

3 回答 3

8

您的查询示例限制了 user_id ,因此它应该适用于第二种表格格式。但是,如果您实际上是在尝试运行类似的查询

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

然后你需要一个额外的表来处理这些查询,它只会在 Date 而不是 user id 上排序

Create Table LookupByDate ... PRIMARY KEY ((website_id, item_id), date)
于 2014-02-27T19:29:58.603 回答
1

除了您的主要查询之外,如果您尝试获得的只是“返回最近插入的日期”,您可能不需要额外的表。您可以使用“静态列”来存储每个分区的最后更新时间。卡珊德拉-6561

于 2014-12-06T20:52:38.687 回答
1

它可能对您的特定情况没有帮助(因为我想您的所有用户列表大得难以管理),但是如果第一个聚类列上的条件与一组相对较小的值中的一个匹配,那么您可以使用IN.

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

不要IN在分区键上使用,因为这将创建一个低效的查询,该查询会命中多个节点,从而给协调节点带来压力。相反,并行执行多个异步查询。但是IN聚类列上绝对没问题。

于 2019-12-04T11:45:52.603 回答