我想知道使用“=”或 IN 关键字编写 CQL 查询来基于特定字段获取数据是否有任何机械差异。查询将如下所示:
... WHERE id = "foo"
vs ... WHERE id IN ["foo"]
我目前正在尝试通过使用令牌感知策略制作准备好的语句来直接绕过协调器节点,从而提高查询的性能。我读到,对于多个字段使用“IN”关键字的多获取查询将通过协调器节点进行路由,因此我想绕过它以提高性能,并且我不确定如果我将“IN”与一个单一的ID。我还想确认使用一个 ID 发送 20 个查询比使用 20 个 ID 发送 1 个查询性能更高。
此外,这种发送单个 ID 的方法是否与我们增加 Cassandra 中的节点数量相同?如果我们有一个非常大的 Cassandra,比如说 90 个节点,但客户端只知道三个节点,这是否意味着我们仍然会通过协调器节点?
您上面的问题中有多个问题。
Apache Cassandra® 的 DataStax 驱动程序中没有使用解析器来解析 CQL 语句,因此您在上述问题中描述的优化无法在客户端完成。因此,如果您只有 1 个值,最好将其与
=
运算符一起使用。
此外,用
IN
值堆积查询也不是一个好主意。如果只是 1 或 2,那么就可以了,否则协调节点必须等待所有副本节点获取 IN
子句中的值的数据才能响应客户端。相反,这里推荐的做法是“利用异步查询”。 这里是一个示例存储库,展示了如何通过 Java 驱动程序利用异步编程。
对于您的第三个问题,无论 Cassandra 集群中的节点数量如何,它始终会扩展。此外,一旦客户端进行初始握手,它无论如何都会知道集群的整个拓扑,并且您假设它只知道 3 个节点作为 90 节点集群的一部分,这是不正确的理解。
p/s 以后如果能把多个问题分开发帖就更好了。