避免在 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
我是 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