创造 id 作为分区键,日期和时间作为集群键工作? 从技术上说你可以,但表现会很糟糕。使用 id 因为分区键会将所有行放在不同的节点上,而不考虑时间戳。当您希望按时间范围进行查询时,还应该按时间组件存储数据。 有可能为所有人订购吗 ids i、 例如,分区键没有任何条件? 不,完全不可能。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)
这使用了一种称为“bucketing”的建模技术,因为我不确定在给定的时间段内可能发生的条目数(只有您知道),所以我猜测并使用“month”作为示例。基本上,您需要选择一个时间“桶”,它是: 足够大到有用(提供查询的数据) 小到可以满足Cassandra每分区2gb/20亿个单元的要求。 然后,在查询中提供bucketing值,以及 creation . 这个 CLUSTERING ORDER 定义将数据存储在 creation 按降序排列。 id 添加到结尾以确保唯一性。我已经多次使用此模式来解决日期/时间组件上的范围查询模型。
1条答案
按热度按时间igsr9ssn1#
创造
id
作为分区键,日期和时间作为集群键工作?从技术上说你可以,但表现会很糟糕。使用
id
因为分区键会将所有行放在不同的节点上,而不考虑时间戳。当您希望按时间范围进行查询时,还应该按时间组件存储数据。有可能为所有人订购吗
ids
i、 例如,分区键没有任何条件?不,完全不可能。cassandra设计用于执行顺序读取。因此,cassandra中的结果集排序依赖于已经按照您要检索的顺序存储的数据。
我会这样做:
插入一些数据后,此查询工作:
这使用了一种称为“bucketing”的建模技术,因为我不确定在给定的时间段内可能发生的条目数(只有您知道),所以我猜测并使用“month”作为示例。基本上,您需要选择一个时间“桶”,它是:
足够大到有用(提供查询的数据)
小到可以满足Cassandra每分区2gb/20亿个单元的要求。
然后,在查询中提供bucketing值,以及
creation
.这个
CLUSTERING ORDER
定义将数据存储在creation
按降序排列。id
添加到结尾以确保唯一性。我已经多次使用此模式来解决日期/时间组件上的范围查询模型。