在Cassandra中为范围查询设置主键

在Cassandra中为范围查询设置主键,cassandra,primary-key,Cassandra,Primary Key,我想创建一个包含以下列的表:id1、id2、类型、时间、数据、版本 常见的查询是: 从id1=。。。和id2=。。。和类型=… 从id1=。。。和类型=。。。时间>。。。和时间A,timea和time

我想创建一个包含以下列的表:
id1、id2、类型、时间、数据、版本

常见的查询是:

  • 从id1=。。。和id2=。。。和类型=…
  • 从id1=。。。和类型=。。。时间>。。。和时间<…

  • 我不知道如何设置快速查询的主键?

    由于您有两个不同的查询,您可能需要有两个不同的表才能使它们运行良好。这对于Cassandra数据模型来说并不罕见。请记住,对于这两种情况,Cassandra中的主键定义在很大程度上取决于基数和预期的查询模式。由于您只提供了后者,因此可能需要根据
    id1
    id2
    类型的基数进行调整

    从表名称中选择*,其中id1=X,id2=Y,type=Z

    所以在这里我要做一个有根据的猜测,
    id1
    id2
    几乎是唯一的(高基数),就像id通常是一样。我不知道您的应用程序中有多少种类型可用,但只要不超过10000种,这应该可以工作:

    CREATE TABLE table_name_by_ids (
        id1 TEXT,
        id2 TEXT,
        type TEXT,
        time TIMESTAMP,
        data TEXT,
        version TEXT,
    PRIMARY KEY ((id1,id2),type));
    
    这将在
    id1
    id2
    的联合散列上对分区进行键控,按
    类型
    对内部行进行排序(默认升序)

    从表名称中选择*,其中id1=X,type=Z,time>A,time

    同样,支持此查询的表如下所示:

    CREATE TABLE table_name_by_id1_time (
        id1 TEXT,
        id2 TEXT,
        type TEXT,
        time TIMESTAMP,
        data TEXT,
        version TEXT,
    PRIMARY KEY ((id1),type,time))
    WITH CLUSTERING ORDER BY (type ASC, time DESC);
    
    同样,只要您的类型/时间组合不超过几千个,这种方法就应该有效

    不过,我要做的最后一个调整是,判断在应用程序的生命周期中,您希望有多少类型/时间组合。如果这些数据会随着时间的推移而增长,那么上述情况将导致分区增长到无法维护的程度。为了避免这种情况发生,我还建议添加一个时间“桶”

    同样,也需要调整查询:

    select * from table_name_by_id1_time
    where id1= 'X' and type = 'Z'
    and month_bucket='201910'
    and time > '2019-10-07 00:00:00' and time < '2019-10-07 16:22:12';
    

    有关更多信息,请查看原子批次上的DataStax文档:

    在第一个查询中,您指的是
    ,其中id1=。。。和id2=…
    ?是的,它应该是从id1=。。。和id2=。。。键入=…
    非常感谢您。如果我有两个表,这意味着当我想在这个数据库中添加一条记录时,我需要在两个不同的表中插入一条记录。那么我如何保证这两个插入的原子性呢?如果在我向第一个表插入记录后系统崩溃,这两个表中的数据可能不一致。@HaoChen编辑。感谢您的提示。我发现范围查询非常慢,
    select*from table_name,其中id1=X,type=Z,time>a和time
    <代码>时间
    是时间戳,因此我们有太多的类型/时间组合,超过几千个。有没有更有效的查询方法?
    select * from table_name_by_id1_time
    where id1= 'X' and type = 'Z'
    and month_bucket='201910'
    and time > '2019-10-07 00:00:00' and time < '2019-10-07 16:22:12';
    
    BEGIN BATCH
    
      INSERT INTO table_name_by_ids (
        id1, id2, type, time, data, version
      ) VALUES (
        'X', 'Y', 'Z', '2019-10-07 12:00:01','stuff','1.0'
      ) ;
    
      INSERT INTO table_name_by_id1_time (
        id1, id2, type, time, data, version, month_bucket
      ) VALUES (
        'X', 'Y', 'Z', '2019-10-07 12:00:01','stuff','1.0','201910'
      );
    
    APPLY BATCH;