我的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
我应该如何设计分区键来实现这一点?
1条答案
按热度按时间bvhaajcl1#
对于cassandra,建议采用基于查询的建模方法。为此,每个需要支持的查询都有一个表是很常见的。
对于第一个查询,我马上看到的最大问题是没有
WHERE
条款。这将导致cassandra必须检查每个节点以构建一个结果集;我绝对不想这样。但听起来你最关心的是最近的数据,或者某个特定日期的数据。为此,我们需要基于日期/时间组件创建一个分区键或“bucket”。注意,这也是必需的,因为无法对从多个分区检索的数据进行排序。
为此,数据的基数很重要。你选择的是前1024名,那么一天内得到这么多是不是很常见?还是一个多星期?现在,我假设“天”,加上
day_bucket
列。此主键定义将按天对数据进行分区(例如:20200710)。在这些分区中,数据将按
created
按降序排列(最新的在最上面)。这个id
添加列以确保唯一性。这将支持以下查询:您可以在多天内运行多个查询。您甚至可以按周或月“bucket”,假设这不会超过20亿个单元/分区的限制。
支持此查询:
…更容易。
这是可行的,但可能会遇到“未绑定行增长”的问题。基本上,如果继续为每个设备添加设备样本,分区大小最终将达到最大值。所以添加
day_bucket
(或任何对您有效的时间段)作为额外的分区密钥可能是必要的:通过此更改,查询也需要更改: