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

Avoiding filtering with a compound partition key in Cassandra

我是 Cassandra 的新手,目前必须在 Cassandra 中关注 table:

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 = ?。因为 table 有一个复合分区键,所以这个查询需要过滤。我意识到这是在查询大量数据和分区,但这是应用程序所必需的。作为参考,id 的基数相对较低,secondary_id 的基数较高。

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

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

一种方法是,如果您知道所有 secondary_id(您可以添加 table 以在必要时跟踪它们)并在您的应用程序中完成工作并查询所有(id,secondary_id) 对并在之后处理它们。这样做的缺点是更复杂,但优点是可以使用异步查询并并行完成,集群中的许多节点都参与处理您的任务。

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