使用支持 order by 的集群键创建 table

Creating table with cluster keys that support order by

我需要创建一个table,其中包含id、创建日期、时间和其他字段。我需要根据最新创建日期和时间查询一些 'n' 记录。为了实现这一点,table 应该如何?以 id 作为分区键,以日期和时间作为集群键的创建有效吗? 是否可以对所有 ID 进行排序,即分区键没有任何条件?

Creation with id as partition key, and date and time as cluster keys work?

从技术上讲,您 可以 ,但性能会很糟糕。使用 id 作为分区键会将所有行放在不同的节点上,而不管时间戳。因为你想按时间范围查询,你也应该按时间组件存储你的数据。

Is it possible to do order by for all ids i.e., without any condition on partition key?

不,完全不可能。 Cassandra 旨在执行顺序读取。因此,Cassandra 中的结果集排序取决于已经按照您要检索它的顺序存储的数据。

我会这样做:

CREATE TABLE events (
  id UUID,
  month_bucket INT,
  creation TIMESTAMP,
  name TEXT,
  PRIMARY KEY ((month_bucket),creation,id))
WITH CLUSTERING ORDER BY (creation DESC, id ASC);

插入一些数据后,此查询有效:

aploetz@cqlsh:Whosebug> SELECT * FROM events
    WHERE month_bucket=202005 
    AND creation >= '2020-05-01' AND creation < '2020-05-13';

 month_bucket | creation            | id          | name
--------------+---------------------+-------------+----------------
       202005 | 2020-05-05 05:00:00 | 1d073ed5... |  Cinco de Mayo
       202005 | 2020-05-04 05:00:00 | 3cca75a0... | May the Fourth
       202005 | 2020-05-01 05:00:00 | fd2bb58f... |        May Day

(3 rows)

这利用了一种称为 "bucketing." 的建模技术,因为我不确定在给定时间段内可能发生的条目数(只有你知道),我猜测并使用了 "month" 举个例子。基本上,您需要选择一个时间 "bucket",即:

  • 大到有用(提供查询的数据)
  • 小到足以满足 Cassandra 的每个分区 2GB/20 亿个单元的要求。

然后,在 creation.

上提供带有查询的分桶值以及范围组件

CLUSTERING ORDER 定义使 creation 存储的数据按降序排列。 id 添加到末尾以确保唯一性。我已经多次使用此模式解决 date/time 组件上的范围查询模型。