【问题标题】:Cassandra - one big table vs many tablesCassandra - 一张大桌子与多张桌子
【发布时间】:2017-02-07 18:42:13
【问题描述】:

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

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

  • ParameterId (int) - 将作为表的 id。
  • 值(大整数)
  • MeasureTime(时间戳)

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

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

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

或者最好创建 1000 个仅包含 value 和 measureTime 的表,如果是这样,我是否可以对我的 MeasureTime 进行范围查询?

【问题讨论】:

    标签: database-design cassandra datastax


    【解决方案1】:

    你会用这个打很宽的行。我建议不要使用您的表格格式,并且我会选择一些可以让您控制行宽的东西。

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

    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 小时),那么您将需要执行多个查询。

    【讨论】:

    • 谢谢!这就像一个魅力。我的阅读表现现在是通过屋顶!而且额外的查询很容易以编程方式处理。
    【解决方案2】:

    我们在这里有两种方法,每种方法都有自己的优点和缺点。

    方法1:每个参数创建1个表(1000个表只包含 一个值和measureTime)

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

    方法二:创建一张大表

    NoSql DB 旨在为更多记录提供更好的性能。即使拥有十亿条记录也会带来良好的性能。

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

    【讨论】:

    • 虽然您的答案对于一般的 nosql 数据库来说是一个广泛的答案,但这个问题是针对 cassandra 的。 1000 个表对 cassandra 不利(每个表的内存开销),您应该尝试保持在“数百”而不是“数千”。你不需要/没有与 cassandra 的分片。
    猜你喜欢
    • 2011-07-16
    • 2011-11-17
    • 2012-05-23
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多