创建带有群集键的表,支持按顺序排列

问题描述 投票:1回答:1

我需要创建一个包含id、创建日期、时间和其他字段的表,我需要根据最新的创建日期和时间查询一些'n'记录。我需要根据最新的创建日期和时间来查询一些'n'记录。为了达到这个目的,表应该是怎样的?以id为分区键,以日期和时间为簇键的创建可以吗?是否可以对所有id进行排序,即不对分区键设置任何条件?

cassandra cql cassandra-3.0
1个回答
0
投票

创建与 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每个分区2GB20亿单元的要求之下。

然后,在查询中提供bucketing值,以及一个范围组件,在 creation.

CLUSTERING ORDER 定义保留了由 creation 按降序排列。 id 后面加了一个词,以此来保证唯一性。 我曾多次使用这种模式来解决日期时间组件的范围查询模型。

© www.soinside.com 2019 - 2024. All rights reserved.