【问题标题】:What is better in cassandra many tables of same structure or one table with many rows在 cassandra 中具有相同结构的多个表或具有多行的一个表中什么更好
【发布时间】:2017-11-27 08:36:16
【问题描述】:

假设我有 1000 个结构完全相同的实体。例如所有实体都有三个字段:

String id;
String name;
int amount;

我还预计系统中每种类型的实体都会有大量的。

所以我现在有两种变体:

  1. 为每个实体创建单独的表,如下所示:

    CREATE TABLE <SOME_ENTITY_NAME> (
        id text PRIMARY KEY,
        name text,
        amount int
    )
    
  2. 我将只创建一个带有复合主键的表:

    CREATE TABLE ALL_ENTITIES_TABLE (
        entity_name text,
        id text,
        name text,
        amount int,
        PRIMARY KEY ((entity_name, id))
    );
    

当然,只支持一张表更简单,但是性能呢?

那么,考虑到每种类型的实体将拥有数百万(可能是数十亿)条记录,问题是哪种变体在性能方面更好?

【问题讨论】:

  • 你的访问模式是什么......无论如何,第二种方法要好得多......WHERE entity_name='' and id=''将由第二张桌子有效处理......如果你有不同的用例......分享你的用例

标签: cassandra cql bigdata


【解决方案1】:

Cassandra 集群中可以创建的表的数量有限制。通常的建议是将此数字保持在 200 以下,~500 就像“硬停”...

原因是每个表都需要分配额外的内存和其他资源来保存辅助数据,例如键/行缓存、布隆过滤器等。根据 Cassandra 版本,每个表可能需要 1-2Mb内存。

因此,在您的情况下,第二种设计更好,因为您将所有数据保存在单个表中,并且您的分区键将允许在集群节点之间均匀分布数据。

【讨论】:

    【解决方案2】:

    Cassandra 的设计理念是磁盘空间是所有资源中最便宜的。您必须围绕您将最常使用的查询构建数据模型,无论此模型是否会消耗更多磁盘空间 - 只要它以最有效的方式服务于您的查询目的。如果不查看您将使用的查询,我将无法回答您的问题。一般来说,您必须随意创建所需数量的表,只要它符合您的查询目的。我建议您看看here

    【讨论】:

    • 如果涉及到大于数百个的数字,您就不能拥有尽可能多的表......
    【解决方案3】:

    在我看来,第一种方法在可维护性方面是不正确的。太多动态创建的表应该很难维护。此外,如果您正确使用分区/聚类顺序(根据数据检索的需要),查询应该更容易和有效。此外,如果您使用的是 3.x 版本的 Cassandra,二级索引可以派上用场。

    注意:二级索引不允许排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 2022-07-30
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多