cassandrawhere子句中的IN查询

cassandrawhere子句中的IN查询,cassandra,cql,cassandra-3.0,scylla,cqlengine,Cassandra,Cql,Cassandra 3.0,Scylla,Cqlengine,我用下面的查询创建了一个包含3个节点和1个表的锡拉集群 CREATE TABLE id_features ( id int PRIMARY KEY, id_feature_1 int, id_feature_2 int, ) 我对申请表提出以下质疑 从id_特征中选择*,其中id位于(1,2,3,4…120) 查询最多可以有120个ID 在最坏的情况下,此查询是否会基于id的令牌值联系所有3个节点以获取120个id的数据? 或者只联系1个节点来获取所有ID的数据,多个

我用下面的查询创建了一个包含3个节点和1个表的锡拉集群

CREATE TABLE id_features (
    id int PRIMARY KEY,
    id_feature_1 int,
    id_feature_2 int,

)
我对申请表提出以下质疑
从id_特征中选择*,其中id位于(1,2,3,4…120)
查询最多可以有120个ID

在最坏的情况下,此查询是否会基于id的令牌值联系所有3个节点以获取120个id的数据? 或者只联系1个节点来获取所有ID的数据,多个节点仅用于高可用性

复制因子、一致性级别和负载平衡策略是否会在决定节点时发挥任何作用

此查询是否会基于
id
s的令牌值联系所有3个节点以获取数据

复制因子、一致性级别和负载平衡策略是否会在决定节点时发挥任何作用

这在很大程度上取决于复制因子(RF)、查询一致性和负载平衡策略。具体而言,如果RF<节点数,则将基于
id
的哈希令牌值和主要分配给这些令牌范围的节点联系多个节点

但是,鉴于这种说法:

或者只联系1个节点来获取所有ID的数据,多个节点仅用于高可用性

…在这种情况下,我感觉RF=3

如果应用程序配置为使用(默认)
TokenAwarePolicy
,则是,仅对于单键查询,可以将请求发送到各个节点

但是在本例中,查询使用的是
in
操作符。根据120个潜在条目,查询无法确定发送查询的单个节点。在这种情况下,
TokenAwarePolicy
只是作为其子策略的传递(
dcawarerroundrobinpolicy
),它将选择距离
LOCAL
的节点作为“协调器”。协调器节点随后将承担路由副本请求和编译结果集的额外任务

至于查询计划中是否使用了非主副本,答案仍然是“这取决于”。虽然负载平衡策略在实现上有所不同,但通常所有策略都会计算:

  • 每个查询都不同,以平衡整个集群的负载
  • 仅包含已知能够处理查询的主机,即既不被忽略也不停机
  • 偏爱本地主机而不是远程主机
摘自:

因此,在RF=节点数的场景中,有时可以使用单个节点返回所有请求的副本

专业提示

尽量不要将
IN
运算符与120个分区键项的列表一起使用。这迫使Cassandra执行随机读取,而它在顺序读取方面确实表现出色。如果这是应用程序真正需要执行的查询,请尝试:

  • 构建新表以更好地支持该查询模式
  • 不超过
项的两位数

要添加到这一点上,120个单独的异步查询可能会快得多。总的来说,分区键上的
中的不可用recommended@AlexOtt绝对地正在等待后续问题提及,但这是有效的@除此之外,亚伦还有一个很好的回答;我认为这篇博文对于理解在不同的配置和场景中如何完成读取非常有用