【问题标题】:Creating table with cluster keys that support order by使用支持 order by 的集群键创建表
【发布时间】:2020-05-13 22:44:02
【问题描述】:

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

【问题讨论】:

标签: cassandra cql cassandra-3.0


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-11-17
    • 2017-06-15
    • 1970-01-01
    • 2013-05-11
    • 2017-09-25
    • 2014-11-13
    • 2014-01-27
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多