使用支持 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 组件上的范围查询模型。
我需要创建一个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 组件上的范围查询模型。