Cassandra - 一大 table 与许多 table
Cassandra - one big table vs many tables
我目前正在试用 Cassandra 数据库。
我正在使用 DataStax 开发中心和 DataStax C# 驱动程序。
我当前的模型非常简单,仅包含:
- ParameterId (int) - 将作为 table.
的 ID
- 值(bigint)
- MeasureTime(时间戳)
我将拥有 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)
这与您的非常相似,但它有一个主要优势:您可以配置行的宽度,并且没有任何热点。这个想法非常简单:parameterId
和 granularity
字段都构成了 分区键 ,所以它们告诉你的数据将去哪里,而 measureTime
会保持数据有序。假设您想要按天查询,您可以将 measureTime
的值 yyyy-mm-dd
存储到 granularity
中,将同一天的所有度量组合在一起。
这允许您使用有效的范围查询检索位于同一分区上的所有值(因此根据给定的 parameterId
和 granularity
字段对)。在逐日配置中,您最终会得到每个分区 86400 条记录。这个数字可能仍然很高(建议限制为 10k IIRC),您可以通过使用 yyyy-mm-dd HH:00
值进行每小时分组来降低该值。
该方法的缺点是,如果您需要来自多个分区的数据(例如,您按天分组,但您需要连续两天的数据,例如 1 月 19 日的最后 6 小时, 以及 1 月 20 日的前 6 个小时),那么您将需要执行多个查询。
我目前正在试用 Cassandra 数据库。 我正在使用 DataStax 开发中心和 DataStax C# 驱动程序。
我当前的模型非常简单,仅包含:
- ParameterId (int) - 将作为 table. 的 ID
- 值(bigint)
- MeasureTime(时间戳)
我将拥有 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)
这与您的非常相似,但它有一个主要优势:您可以配置行的宽度,并且没有任何热点。这个想法非常简单:parameterId
和 granularity
字段都构成了 分区键 ,所以它们告诉你的数据将去哪里,而 measureTime
会保持数据有序。假设您想要按天查询,您可以将 measureTime
的值 yyyy-mm-dd
存储到 granularity
中,将同一天的所有度量组合在一起。
这允许您使用有效的范围查询检索位于同一分区上的所有值(因此根据给定的 parameterId
和 granularity
字段对)。在逐日配置中,您最终会得到每个分区 86400 条记录。这个数字可能仍然很高(建议限制为 10k IIRC),您可以通过使用 yyyy-mm-dd HH:00
值进行每小时分组来降低该值。
该方法的缺点是,如果您需要来自多个分区的数据(例如,您按天分组,但您需要连续两天的数据,例如 1 月 19 日的最后 6 小时, 以及 1 月 20 日的前 6 个小时),那么您将需要执行多个查询。