Java 在CQL中使用IN-condition用于分区密钥而不会降低性能
我已经知道在()中使用反模式 但如果我有一组属于同一标记的分区键呢 那么,假设我们有下一个代码:Java 在CQL中使用IN-condition用于分区密钥而不会降低性能,java,cassandra,cql,anti-patterns,where-in,Java,Cassandra,Cql,Anti Patterns,Where In,我已经知道在()中使用反模式 但如果我有一组属于同一标记的分区键呢 那么,假设我们有下一个代码: public ResultSet getDataForFirstTokenRange(List<String> initialKeys) Cluster cluster = Cluster.builder().addContactPoints(DEFAULT_SEEDS) .withClusterName(DEFAULT_CLUSTER_NAME).build();
public ResultSet getDataForFirstTokenRange(List<String> initialKeys)
Cluster cluster = Cluster.builder().addContactPoints(DEFAULT_SEEDS)
.withClusterName(DEFAULT_CLUSTER_NAME).build();
Metadata meta = cluster.getMetadata();
Set<TokenRange> tokens = meta.getTokenRanges();
TokenRange firstTr = tokens.iterator().next();
List<String> filteredKeys = filterKeysForToken(firstTr, initialKeys, meta)
return session.execute(
"select * from MY_TABLE where key IN (" +
String.join(
", ",
filteredKeys.stream()
.map(key -> "'" + key + "'")
.collect(Collectors.toList())
) +
")"
);
}
private List<String> filterKeysForToken(TokenRange tr, List<String> keys, Metadata meta) {
return keys.stream()
.filter(key -> {
Token token = meta.newToken(TypeCodec.varchar().serialize(
key,
ProtocolVersion.NEWEST_SUPPORTED
));
return tr.contains(token);
})
.collect(Collectors.toList());
}
公共结果集getDataForFirstTokenRange(列出初始密钥)
Cluster Cluster=Cluster.builder().addContactPoints(默认种子)
.withClusterName(默认集群名称).build();
Metadata meta=cluster.getMetadata();
Set tokens=meta.getTokenRanges();
TokenRange firstTr=tokens.iterator().next();
List filteredKeys=filterKeysForToken(firstTr、initialKeys、meta)
返回会话。执行(
“从输入的MY_表中选择*”(+
String.join(
", ",
filteredKeys.stream()
.map(键->“'+key+”))
.collect(收集器.toList())
) +
")"
);
}
私有列表筛选器Keysfortoken(令牌范围tr、列表密钥、元数据元){
返回keys.stream()
.过滤器(键->{
Token Token=meta.newToken(TypeCodec.varchar().serialize(
钥匙
支持ProtocolVersion.u
));
返回tr.contains(令牌);
})
.collect(Collectors.toList());
}
所以,这里我过滤分区键的初始列表,这样结果列表只属于一个令牌范围
然后我提出了一个问题
所以问题是,这里会有性能问题吗?
如果没有,这种方法会比为每个分区键执行单独的查询更好吗?我假设您已经知道分区键告诉Cassandra节点数据存储在哪个节点中 从功能上讲,拥有多个异步查询和一个IN子句是同一回事:您将命中集群中的一个节点。但是,拥有IN子句应该是一个主要的性能影响,因为协调器在将答案返回给客户机之前等待所有数据可用。相反,如果发出多个异步查询,则会有单独的流到客户端,每个查询一个流,并且应该能够更快地处理数据