代码之家  ›  专栏  ›  技术社区  ›  kevad

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

  •  7
  • kevad  · 技术社区  · 10 年前

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

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

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

    有什么方法可以做到这一点吗?我错过了什么吗?

    非常感谢!

    3 回复  |  直到 10 年前
        1
  •  9
  •   RussS    10 年前

    您的查询示例限制了user_id,因此应该使用第二种表格式。但如果您实际上试图运行如下查询

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

    然后您需要创建一个额外的表来处理这些查询,它只会在Date上排序,而不会在用户id上排序

    Create Table LookupByDate ... PRIMARY KEY ((website_id, item_id), date)
    
        2
  •  1
  •   treehouse    10 年前

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

        3
  •  1
  •   Ian Goldby    5 年前

    这可能对您的特定情况没有帮助(因为我认为您的所有用户列表非常大),但是如果第一个集群列上的条件与一组相对较小的值中的一个匹配,那么您可以使用 IN .

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

    不要使用 因为这将创建一个低效的查询,该查询会命中多个节点,从而给协调器节点带来压力。而是并行执行多个异步查询。但是 聚类 柱是绝对好的。