【问题标题】:Cassandra CQL - clustering order with multiple clustering columnsCassandra CQL - 具有多个聚类列的聚类顺序
【发布时间】:2014-03-31 09:58:43
【问题描述】:

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

...
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) ;

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

有什么方法可以实现吗?我错过了什么吗?

非常感谢!

【问题讨论】:

    标签: cassandra cql cql3 cqlsh


    【解决方案1】:

    您的查询示例限制了 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)
    

    【讨论】:

    • 感谢您的回答@RussS。第二种格式:PRIMARY KEY ((website_id, item_id), date, user_id) 阻止我使用过滤器:AND user_id = 0 AND date > 'some_date' ; 因为日期在 user_id 之前并且受非 EQ 方程的限制。现在,没有 user_id 作为分区列的第二个解决方案阻止了我拥有每个用户的数据,因为唯一性受到三元组(website_id、item_id、date)的约束。我是不是哪里错了?
    • 不,您只需要使用 both 表。在写入时插入两者。即,您需要为每种查询格式提供一个表
    • 好的,我明白你的意思。感谢您的回答,感谢您的澄清!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-08-01
        • 2023-03-03
        • 2014-12-21
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 2021-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多