gpt4 book ai didi

查询中的 Cassandra 集群键与多查询效率

转载 作者:行者123 更新时间:2023-12-04 01:38:39 32 4
gpt4 key购买 nike

簇键上的 in 运算符是否比多个相等查询更有效?

select * from table where primaryKey1 = 1 and primaryKey2 = 2 and clusterKey in (1,2) 

对比2 个查询。

select * from table where primaryKey1 = 1 and primaryKey2 = 2 and clusterKey = 1 

select * from table where primaryKey1 = 1 and primaryKey2 = 2 and clusterKey = 2

最佳答案

这取决于您要在 IN 运算符中放入多少值。在效率方面,两者将花费大约相同的时间来返回 resultSet。但是,如果您的值会更大,则最好使用多个查询而不是使用 IN 运算符。

这是由于 Cassandra 的分布式节点结构,当您使用带有 IN 关键字的单个查询时,请求/响应将仅由一个节点处理。此外,如果出现问题,Cassandra 将从头开始重新运行整个查询,并且不会存储检索到的结果。

您可以在 Java 或 Python 中使用异步查询,这将以批处理的形式运行多个查询。我将允许请求/响应通过多个节点,如果单个查询失败,它可以仅针对该特定查询重试。

例如:

CREATE TABLE IF NOT EXISTS users (id uuid PRIMARY KEY, name text);

SELECT * FROM users WHERE id IN (
e6af74a8-4711-4609-a94f-2cbfab9695e5,
281336f4-2a52-4535-847c-11a4d3682ec1,
c32b8d37-89bd-4dfe-a7d5-5f0258692d05
);

这不一定是最优的:这个查询将被发送到一个协调节点,然后它必须为每个分区键查询副本。考虑到我们有一个聪明的 token-aware驱动程序,为每个分区键 (SELECT * FROM users WHERE id = ?) 发送一个单独的查询会更有效,这将直接到达正确的副本。然后剩下的就是在客户端整理结果。

Future<List<ResultSet>> future = ResultSets.queryAllAsList(session, 
"SELECT * FROM users WHERE id = ?",UUID.fromString("e6af74a8-4711-
4609-a94f-2cbfab9695e5"), UUID.fromString("281336f4-2a52-4535-847c-
11a4d3682ec1"));
for (ResultSet rs : future.get()) {
process the result set
}

如需更多说明,请阅读以下链接: https://lostechies.com/ryansvihla/2014/09/22/cassandra-query-patterns-not-using-the-in-query-for-multiple-partitions/

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

关于查询中的 Cassandra 集群键与多查询效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48411001/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com