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