我有2个节点的Cassandra集群。我的表结构是Statement select = QueryBuilder.select().all().from(tableName).where(QueryBuilder.containsKey("list", value)); select.setFetchSize(50000);
。我试图获取包含给定列表的所有密钥。我的查询看起来像
.attr("position", "fixed")
但是我在读取查询期间遇到了cassandra超时。
我可以减少 setFetchSize 但是花费太多时间来处理1900万行。
Cassandra版本= Cassandra 2.2.1
答案 0 :(得分:1)
Cassandra数据建模最佳实践建议不要使用集合(列表,集合,映射)来存储大量数据。原因是当加载CQL行(SELECT ... WHERE id = xxx)时,Cassandra服务器必须在内存中加载整个集合。
现在回答你的问题:
- 任何人都可以建议正确的方法来解决这个问题吗?
醇>
使用辅助索引检索庞大的数据集(1900万)并不是解决问题的最佳方法。
如果您的要求是:给我所有包含项目的列表,以下架构可能更合适
解决方案1:手动非规范化
CREATE TABLE base_table(
id text,
key int,
value timestamp,
PRIMARY KEY(id, key)
);
CREATE TABLE denormalized_table_for_searching(
key int,
id text
value timestamp,
PRIMARY KEY(key, id));
// Give me all couples (id,value) where key = xxx
// Use iterator to fetch data by page and not load 19 millions row at once !!
SELECT * FROM denormalized_table_for_searching WHERE key=xxx;
解决方案2:使用Cassandra 3.0物化视图进行自动非规范化
CREATE TABLE base_table(
id text,
key int,
value timestamp,
PRIMARY KEY(id, key)
);
CREATE MATERIALIZED VIEW denormalized_table_for_searching
AS SELECT * FROM base_table
WHERE id IS NOT NULL AND key IS NOT NULL
PRIMARY KEY(key, id);
// Give me all couples (id,value) where key = xxx
// Use iterator to fetch data by page and not load 19 millions row at once !!
SELECT * FROM denormalized_table_for_searching WHERE key=xxx;
- 有这种问题可以选择吗?
醇>
见上面第1点的答案:)