允许过滤,在cql中进行数据建模

时间:2013-09-09 08:37:30

标签: cassandra

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

目前,我正在处理广告系列结构的数据模型。我在cassandra上有一个活动表,其中包含以下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过滤,则会出现一条警告,指出该语句具有不可预测的性能。那么,依靠allow filtering是一种好的做法吗?还有什么其他选择?

1 个答案:

答案 0 :(得分:13)

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

如果您要返回大部分数据,这是可以的,因此跳过的数据不会花费太多。但如果你跳过大部分数据,很多工作都会被浪费掉。

另一种方法是在主要密钥的第一个组件中包含时间。例如。您可以拥有日期存储桶,并在包含所需数据的每一天复制您的查询。此方法可确保Cassandra读取的大多数数据都是您想要的数据。问题是桶的所有数据(例如一天)需要适合一个分区。您可以通过以某种方式分割分区来解决此问题,例如包括其中的uid的一些方面。