cassandra—使用支持order by的集群键创建表

ac1kyiln  于 2021-06-13  发布在  Cassandra
关注(0)|答案(1)|浏览(751)

我需要创建一个带有id、创建日期、时间和其他字段的表。我需要根据最新的创建日期和时间查询一些“n”记录。为了做到这一点,table该怎么办?以id作为分区键,以日期和时间作为集群键进行创建?是否可以对所有ID进行排序(即,在分区键上没有任何条件)?

igsr9ssn

igsr9ssn1#

创造 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 添加到结尾以确保唯一性。我已经多次使用此模式来解决日期/时间组件上的范围查询模型。

相关问题