IN Cassandra Where 子句中的查询
IN Query in Cassandra Where clause
我有一个 Scylla 集群,其中包含 3 个节点和 1 个 Table,使用以下查询创建
CREATE TABLE id_features (
id int PRIMARY KEY,
id_feature_1 int,
id_feature_2 int,
)
我正在从应用程序发出以下查询
SELECT * FROM id_features where id in (1,2,3,4...120);
查询最多可以有120个id。
在最坏的情况下,此查询是否会根据 id 的令牌值联系所有 3 个节点以获取 120 个 id 的数据?
或者仅联系 1 个节点以获取所有 ID 的数据,多个节点仅用于高可用性
复制因子、一致性级别和负载平衡策略是否会在决定节点方面发挥作用?
Will this Query contact all 3 nodes based on the token value of id
s to fetch data
Do the replication factor, consistency level, and load balancing policy will play any role in deciding the node?
这在很大程度上取决于复制因子 (RF)、查询一致性和负载平衡策略等因素。具体来说,如果 RF < 节点数,则将根据 id
的散列令牌值和主要分配给这些令牌范围的节点联系多个节点。
但是,鉴于此声明:
Or only 1 node will be contacted to fetch the data for all the ids and multiple nodes are used only for high availability
...我觉得在这种情况下 RF=3。
如果应用程序配置为使用(默认)TokenAwarePolicy
那么是的,仅对于单键查询,可以将请求发送到各个节点。
但在本例中,查询使用的是 IN
运算符。根据这 120 个潜在条目,查询 无法 确定发送查询的单个节点。在这种情况下,TokenAwarePolicy
只是作为其子策略 (DCAwareRoundRobinPolicy
) 的传递,它将选择 LOCAL
距离处的节点作为“协调器”。然后,协调器节点将承担路由副本请求和编译结果集的额外任务。
至于查询计划中是否使用非主副本,答案还是“视情况而定”。虽然负载均衡策略在实现上有所不同,但通常它们都计算 query plans which:
- 每个查询都不同,以平衡整个集群的负载;
- 只包含已知能够处理查询的主机,即既不忽略也不关闭;
- 比远程主机更喜欢本地主机。
摘自:https://docs.datastax.com/en/developer/java-driver/3.6/manual/load_balancing/#query-plan
因此在 RF = 节点数的情况下,单个节点 有时 可用于 return 所有请求的副本。
专业提示:
尽量不要对包含 120 个分区键条目的列表使用 IN
运算符。这迫使 Cassandra 执行 随机 读取,它真正擅长 顺序读取 。如果这是应用程序真正需要执行的查询,请尝试:
- 构建新的 table 以更好地支持该查询模式。
IN
. 的条目不超过两位数
我有一个 Scylla 集群,其中包含 3 个节点和 1 个 Table,使用以下查询创建
CREATE TABLE id_features (
id int PRIMARY KEY,
id_feature_1 int,
id_feature_2 int,
)
我正在从应用程序发出以下查询
SELECT * FROM id_features where id in (1,2,3,4...120);
查询最多可以有120个id。
在最坏的情况下,此查询是否会根据 id 的令牌值联系所有 3 个节点以获取 120 个 id 的数据? 或者仅联系 1 个节点以获取所有 ID 的数据,多个节点仅用于高可用性
复制因子、一致性级别和负载平衡策略是否会在决定节点方面发挥作用?
Will this Query contact all 3 nodes based on the token value of
id
s to fetch dataDo the replication factor, consistency level, and load balancing policy will play any role in deciding the node?
这在很大程度上取决于复制因子 (RF)、查询一致性和负载平衡策略等因素。具体来说,如果 RF < 节点数,则将根据 id
的散列令牌值和主要分配给这些令牌范围的节点联系多个节点。
但是,鉴于此声明:
Or only 1 node will be contacted to fetch the data for all the ids and multiple nodes are used only for high availability
...我觉得在这种情况下 RF=3。
如果应用程序配置为使用(默认)TokenAwarePolicy
那么是的,仅对于单键查询,可以将请求发送到各个节点。
但在本例中,查询使用的是 IN
运算符。根据这 120 个潜在条目,查询 无法 确定发送查询的单个节点。在这种情况下,TokenAwarePolicy
只是作为其子策略 (DCAwareRoundRobinPolicy
) 的传递,它将选择 LOCAL
距离处的节点作为“协调器”。然后,协调器节点将承担路由副本请求和编译结果集的额外任务。
至于查询计划中是否使用非主副本,答案还是“视情况而定”。虽然负载均衡策略在实现上有所不同,但通常它们都计算 query plans which:
- 每个查询都不同,以平衡整个集群的负载;
- 只包含已知能够处理查询的主机,即既不忽略也不关闭;
- 比远程主机更喜欢本地主机。
摘自:https://docs.datastax.com/en/developer/java-driver/3.6/manual/load_balancing/#query-plan
因此在 RF = 节点数的情况下,单个节点 有时 可用于 return 所有请求的副本。
专业提示:
尽量不要对包含 120 个分区键条目的列表使用 IN
运算符。这迫使 Cassandra 执行 随机 读取,它真正擅长 顺序读取 。如果这是应用程序真正需要执行的查询,请尝试:
- 构建新的 table 以更好地支持该查询模式。
IN
. 的条目不超过两位数