11

我目前正在使用和研究 cassandra 中的数据建模实践。到目前为止,我知道您需要基于执行的查询进行数据建模。然而,多重select需求使得数据建模更难或不可能在一张表上处理。因此,当您无法在 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 filtering吗?还有什么其他选择?

4

1 回答 1

14

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

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

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

于 2013-09-09T13:28:10.700 回答