使用id 作为分区键,使用日期和时间作为集群键创建?
技术上你可以,但性能会很糟糕。使用id 作为分区键会将所有行放在不同的节点上,而不管时间戳如何。由于您要按时间范围查询,您还应该按时间组件存储数据。
是否可以对所有ids 进行排序,即对分区键没有任何条件?
不,根本不可能。 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:stackoverflow> 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)
这利用了一种称为“分桶”的建模技术。由于我不确定在给定时间段内可能发生的条目数量(只有您知道),所以我猜测并以“月”为例。基本上,您需要选择一个时间“桶”:
- 大到有用(提供查询的数据)
- 小到足以满足 Cassandra 每个分区 2GB/20 亿单元的要求。
然后,在查询中提供分桶值,以及creation 上的范围组件。
CLUSTERING ORDER 定义将creation 存储的数据按降序排列。 id 添加到末尾以确保唯一性。我已经多次使用这种模式来解决日期/时间组件的范围查询模型。