我在不同位置有传感器,每个传感器测量多个参数。每个传感器每天大约会进行 200 万次测量。我需要按位置/时间范围查询,但指定的范围永远不会大于几天。一个示例查询是:
SELECT * FROM meas WHERE latitude=46.1 AND longitude=15.1 AND measurementTime >= 2023-10-15T23:00:00Z AND measurementTime <= 2023-10-16T01:00:00Z;
为了控制分区大小,我可以根据时间窗口拆分分区(我在某处读到这称为分桶) - 例如按纪元后的每一天:
CREATE TABLE meas (
latitude double,
longitude double,
dayOfMeasurement int,
measurementTime timestamp,
param1 double,
param2 double,
param3 double,
etc...
PRIMARY KEY ((latitude, longitude, dayOfMeasurement), measurementTime)
) WITH CLUSTERING ORDER BY (measurementTime DESC)
现在我有两个选择:
SELECT * FROM meas WHERE latitude=46.1 AND longitude=15.1 AND dayOfMeasurement IN (19646,19645) AND measurementTime >= 2023-10-15T23:00:00Z AND measurementTime <= 2023-10-16T01:00:00Z;
SELECT * FROM meas WHERE latitude=46.1 AND longitude=15.1 AND dayOfMeasurement=19645 AND measurementTime >= 2023-10-15T23:00:00Z AND measurementTime < 2023-10-16T00:00:00Z;
SELECT * FROM meas WHERE latitude=46.1 AND longitude=15.1 AND dayOfMeasurement=19646 AND measurementTime >= 2023-10-16T00:00:00Z AND measurementTime <= 2023-10-16T01:00:00Z;
这两个选项哪个更好?如果选项 2 更好 - 是否有一种标准方法可以在 datastax java 驱动程序中组合多个查询的结果? 或者我应该使用其他数据模型?
每个传感器每天大约会进行 200 万次测量
我很好奇分区有多大。说实话,我建议除了按天之外还按小时进行细分,因为每个分区似乎有太多行。但如果它已经工作正常,那么可能就没问题了。
使用多个(上例中为两个)单独的查询并在客户端组合结果
这是我推荐的方法。另一种方法(使用
IN
)的问题是返回结果的顺序会不一致。它将按日期和传感器分组,并按 measurementtime
排序。但分区的顺序将取决于令牌的哈希值,这将不一致。所以我想说,为了确保应用程序级别的行为一致,一些客户端工作是必要的。
您能详细说明一下吗?
所以一般来说,将分区大小保持在 1 或 2 MB 以下是个好主意。保留每个分区的行数也是一个很好的做法 <= 100,000. When rowcounts or partition sizes exceed those values is when operations tend to slow down.
现在,这些并不是严格的数学限制;而是。只是一般准则。一个包含 200 万个小行的分区很可能仍然可以工作。我什至见过大小为 10 MB 或更大的分区。这实际上取决于有效负载大小和访问模式。这就是我上面说的“如果它已经有效,那么它可能没问题。”