在cassandra中设置范围查询的主键

8zzbczxx  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(761)

我想创建一个包含以下列的表: id1, id2, type, time, data, version .
常见的查询是:
select * from table_name where id1 = ... and id2 =... and type = ... select * from table_name where id1= ... and type = ... and time > ... and time < ... 我不知道如何设置快速查询的主键?

ohtdti5x

ohtdti5x1#

由于您有两个不同的查询,您可能需要有两个不同的表才能使它们运行良好。这对于cassandra数据模型来说并不罕见。请记住,对于这两种情况,cassandra中的主键定义在很大程度上取决于基数和预期的查询模式。由于您只提供了后者,因此可能需要根据 id1 , id2 ,和 type . select * from table_name where id1 = X and id2 = Y and 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 ,按 type (默认升序)。 select * from table_name where id1= X and type = Z and time > A and time < B; 同样,支持此查询的表如下所示:

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);

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

version TEXT,
month_bucket TEXT,
PRIMARY KEY ((id1,month_bucket),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';

希望这有帮助。
如何保证这两个插入的原子性?
简单地说,你可以运行这两个 INSERT 在一个原子批次里。

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;

有关更多信息,请查看原子批处理上的datastax文档:https://docs.datastax.com/en/dse/6.7/cql/cql/cql_using/usebatchgoodexample.html

相关问题