如何选择我的Cassandra密钥正确默认排序?

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

我的table samples 由以下列组成:

id : uuid
created : timestamp
device : ascii
reading : float

我的大部分查询都是为了获取最近的 n 所有设备的样本,所以我希望这是默认排序:

SELECT * FROM samples LIMIT 1024

我也希望能够有效地获取最新的 n 给定设备的示例:

SELECT * FROM samples WHERE device = 'abc' LIMIT 1024

我应该如何设计分区键来实现这一点?

bvhaajcl

bvhaajcl1#

对于cassandra,建议采用基于查询的建模方法。为此,每个需要支持的查询都有一个表是很常见的。

SELECT * FROM samples LIMIT 1024

对于第一个查询,我马上看到的最大问题是没有 WHERE 条款。这将导致cassandra必须检查每个节点以构建一个结果集;我绝对不想这样。但听起来你最关心的是最近的数据,或者某个特定日期的数据。为此,我们需要基于日期/时间组件创建一个分区键或“bucket”。
注意,这也是必需的,因为无法对从多个分区检索的数据进行排序。
为此,数据的基数很重要。你选择的是前1024名,那么一天内得到这么多是不是很常见?还是一个多星期?现在,我假设“天”,加上 day_bucket 列。

CREATE TABLE samples_by_day (
  id uuid,
  created timestamp,
  device ascii,
  reading float,
  day_bucket bigint,
  PRIMARY KEY (day_bucket,created,id)
) WITH CLUSTERING ORDER BY (created DESC, id ASC);

此主键定义将按天对数据进行分区(例如:20200710)。在这些分区中,数据将按 created 按降序排列(最新的在最上面)。这个 id 添加列以确保唯一性。这将支持以下查询:

SELECT * FROM samples_by_day
WHERE day_bucket = 20200710 LIMIT 1024;

您可以在多天内运行多个查询。您甚至可以按周或月“bucket”,假设这不会超过20亿个单元/分区的限制。
支持此查询:

SELECT * FROM samples
WHERE device = 'abc' LIMIT 1024;

…更容易。

CREATE TABLE samples_by_device (
  id uuid,
  created timestamp,
  device ascii,
  reading float,
  day_bucket bigint,
  PRIMARY KEY (device,created,id)
) WITH CLUSTERING ORDER BY (created DESC, id ASC);

这是可行的,但可能会遇到“未绑定行增长”的问题。基本上,如果继续为每个设备添加设备样本,分区大小最终将达到最大值。所以添加 day_bucket (或任何对您有效的时间段)作为额外的分区密钥可能是必要的:

PRIMARY KEY ((device,day_bucket),created,id)

通过此更改,查询也需要更改:

SELECT * FROM samples_by_device
WHERE device = 'abc' AND day_bucket = 20200710 LIMIT 1024;

相关问题