在cassandra中,有许多具有相同结构的表或一个具有多行的表

时间:2017-06-23 17:24:28

标签: cassandra cql bigdata

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

String id;
String name;
int amount;

此外,我预计系统中将存在大量的每种类型的实体。

所以我现在有两个变种:

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

    CREATE TABLE <SOME_ENTITY_NAME> (
        id text PRIMARY KEY,
        name text,
        amount int
    )
    
  2. 我只创建一个表,但使用复合priamry键:

    CREATE TABLE ALL_ENTITIES_TABLE (
        entity_name text,
        id text,
        name text,
        amount int,
        PRIMARY KEY ((entity_name, id))
    );
    
  3. 当然,只支持一个表更简单,但性能如何?

    所以,问题是哪种变体在性能方面更好,考虑到每种类型的实体都会有数百万(可能是数十亿)的记录?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

注意:辅助索引不允许排序。

答案 2 :(得分:0)

Cassandra的设计围绕着磁盘空间是最便宜的资源。您必须围绕最常使用的查询构建数据模型,无论此模型是否会占用更多磁盘空间 - 只要它以最有效的方式满足您的查询目的。如果不查看您将要使用的查询,我将无法回答您的问题。通常,只要满足查询目的,您就可以随意创建所需数量的表。我建议看看here