Cassandra alllow滤波,cql中的数据建模

Cassandra alllow滤波,cql中的数据建模,cassandra,Cassandra,我目前正在使用和研究cassandra中的数据建模实践。到目前为止,我知道您需要基于执行的查询进行数据建模。然而,多个select需求使得在一个表上处理数据建模更加困难或不可能。因此,当您无法在1个表上处理这些需求时,您需要插入2-3个表。换句话说,您需要在一个操作上进行多个插入 目前,我正在处理一个活动结构的数据模型。我有一张关于卡桑德拉的竞选表格,上面有以下cql CREATE TABLE campaign_users ( created_at timeuuid, campa

我目前正在使用和研究cassandra中的数据建模实践。到目前为止,我知道您需要基于执行的查询进行数据建模。然而,多个
select
需求使得在一个表上处理数据建模更加困难或不可能。因此,当您无法在1个表上处理这些需求时,您需要插入2-3个表。换句话说,您需要在一个操作上进行多个插入

目前,我正在处理一个活动结构的数据模型。我有一张关于卡桑德拉的竞选表格,上面有以下cql

CREATE TABLE campaign_users
(
    created_at timeuuid,
    campaign_id int,
    uid bigint,
    updated_at timestamp,
    PRIMARY KEY (campaign_id, uid),
    INDEX(campaign_id, created_at)
);
在这个模型中,我需要能够在给定时间戳的情况下进行增量导出。在cassandra中,有一种
allow filtering
模式,用于启用对辅助索引的
select
查询。因此,我对增量导出的cql声明如下:

select campaign_id, uid 
from campaign_users
where created_at > minTimeuuid('2013-08-14 12:26:06+0000') allow filtering;

但是,如果使用allow filtering,则会出现一条警告,指出该语句具有不可预测的性能。那么,依赖
允许过滤
是否是一种好的做法?还有其他选择吗?

允许过滤警告是因为Cassandra在内部跳过数据,而不是使用索引和搜索。这是不可预测的,因为您不知道Cassandra每返回一行将跳过多少数据。在最坏的情况下,您可能会扫描所有数据以返回零行。这与不使用
允许过滤
(除了
选择计数
查询)的操作形成对比,其中读取的数据与返回的数据量成线性比例

如果您返回的是大部分数据,这是可以的,因此跳过的数据不会花费太多。但是,如果您跳过了大部分数据,那么大量工作将被浪费


另一种方法是将时间包含在主键的第一个组件中,以桶为单位。例如,您可以使用日存储桶,并对包含所需数据的每天重复查询。此方法保证Cassandra读取的大部分数据都是您想要的数据。问题是bucket(例如day)的所有数据都需要放在一个分区中。您可以通过以某种方式分割分区来解决此问题,例如在分区中包含uid的某些方面。

CQL是否更改了,或者该语法是怎么回事?我看不到
创建表
中的
索引
,也不允许我单独创建索引:
在活动用户上创建索引(活动id,创建时间)