在Cassandra中避免使用复合分区键进行过滤

时间:2018-01-05 17:08:28

标签: cassandra cql cassandra-3.0

我是Cassandra的新手,现在必须在Cassandra中跟随表:

CREATE TABLE time_data (
id int,
secondary_id int,
timestamp timestamp,
value bigint,
PRIMARY KEY ((id, secondary_id), timestamp)
);

复合分区键(带secondary_id)是必要的,以免违反最大分区大小。

我遇到的问题是我想完成查询SELECT * FROM time_data WHERE id = ?。由于该表具有复合分区键,因此此查询需要过滤。我意识到这是一个查询大量数据和分区,但它对于应用程序是必要的。作为参考,id具有相对较低的基数,secondary_id具有较高的基数。

最好的方法是什么?我应该只是允许过滤查询吗?或者最好是创建像CREATE INDEX id_idx ON time_data (id)这样的二级索引?

1 个答案:

答案 0 :(得分:1)

您需要在查询中指定完整的分区键(在大多数情况下,ALLOW FILTERING会严重影响性能)。

一种方法可能是你知道所有secondary_id(你可以添加一个表来跟踪它们)并在你的应用程序中完成工作并查询所有(id,secondary_id)对并在之后处理它们。这样做的缺点是更复杂,但可以通过异步查询和并行来完成群集中的许多节点参与处理任务的优势。

另见https://www.datastax.com/dev/blog/java-driver-async-queries

相关问题