首页 > 解决方案 > 使用支持 order by 的集群键创建表

问题描述

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

标签: cassandracqlcassandra-3.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)

这利用了一种称为“bucketing”的建模技术。由于我不确定在给定时间段内可能发生的条目数量(只有你知道),我猜测并以“月”为例。基本上,你会想要选择一个时间“桶”,它是:

  • 大到有用(提供查询的数据)
  • 小到足以满足 Cassandra 每个分区 2GB/20 亿单元的要求。

然后,为查询提供分桶值,以及creation.

CLUSTERING ORDER定义将存储的数据按creation降序排列。 id被添加到末尾以确保唯一性。我已经多次使用这种模式来解决日期/时间组件的范围查询模型。


推荐阅读