Cassandra - 一大 table 与许多 table

Cassandra - one big table vs many tables

我目前正在试用 Cassandra 数据库。 我正在使用 DataStax 开发中心和 DataStax C# 驱动程序。

我当前的模型非常简单,仅包含:

我将拥有 1000 个(不多不少)参数,从 1 到 1000。并且将在 pr 后为每个参数获取一个条目。第二,将 运行 多年。

我的问题是创建一个 table 是否更好:

CREATE TABLE keyspace.measurement (
    parameterId int,
    value bigint,
    measureTime timestamp,
    PRIMARY KEY(parameterId, measureTime)
) WITH CLUSTERING ORDER BY (measureTime DESC)

或者创建 1000 个 table 只包含一个值和 measureTime 会更好,如果这样我是否可以在我的 MeasureTime 上进行范围查询?

我们这里有两种方法,各有优缺点。

Method 1: Create 1 table per parameter(1000 tables consisting only of a value and measureTime)

如果我们只有有限数量的参数,这种方法会很好,在不久的将来,如果我们需要容纳更多参数,那么每个参数创建一个 table 将变得很麻烦。将 table 放在不同的分片上可以提高性能。

Method 2: Creating one big table

NoSql 数据库旨在为更多记录提供更好的性能。即使拥有十亿条记录也能提供良好的性能。

考虑到这一点"will be getting an entry for each parameter once pr. second and will be running for years.",我觉得方法一最适合你的场景,前提是以后参数数量不会增加。

你会用这个来打很宽的行。我建议不要使用 table 格式,我会选择允许您控制行宽的格式。

根据您的查询要求,我会为您写下更合适的table 架构(恕我直言):

CREATE TABLE keyspace.measurement (
    parameterId int,
    granularity timestamp,
    value bigint,
    measureTime timestamp,
    PRIMARY KEY((parameterId, granularity), measureTime)
) WITH CLUSTERING ORDER BY (measureTime DESC)

这与您的非常相似,但它有一个主要优势:您可以配置行的宽度,并且没有任何热点。这个想法非常简单:parameterIdgranularity 字段都构成了 分区键 ,所以它们告诉你的数据将去哪里,而 measureTime 会保持数据有序。假设您想要按天查询,您可以将 measureTime 的值 yyyy-mm-dd 存储到 granularity 中,将同一天的所有度量组合在一起。

这允许您使用有效的范围查询检索位于同一分区上的所有值(因此根据给定的 parameterIdgranularity 字段对)。在逐日配置中,您最终会得到每个分区 86400 条记录。这个数字可能仍然很高(建议限制为 10k IIRC),您可以通过使用 yyyy-mm-dd HH:00 值进行每小时分组来降低该值。

该方法的缺点是,如果您需要来自多个分区的数据(例如,您按天分组,但您需要连续两天的数据,例如 1 月 19 日的最后 6 小时, 以及 1 月 20 日的前 6 个小时),那么您将需要执行多个查询。