Cassandra 中的 IN 关系是否不利于查询?

2022-09-04 07:32:08

给定 CQL 中以下选择的示例:

SELECT * FROM tickets WHERE ID IN (1,2,3,4)

给定 ID 是分区键,使用 IN 关系是否比执行多个查询更好,还是没有区别?


答案 1

我记得不久前在Cassandra用户邮件列表中看到有人回答这个问题,但我现在找不到确切的消息。具有讽刺意味的是,Cassandra Evangelist Rebecca Mills刚刚发布了一篇文章来解决这个问题(使用Cassandra驱动程序时应该做的事情......点 #13 和 #22)。但答案是“是”,在某些情况下,多个并行查询将比使用 .根本原因可以在DataStax SELECT文档中找到。IN

何时不使用 IN

...使用 IN 可能会降低性能,因为通常必须查询许多节点。例如,在具有 30 个节点、复制因子为 3 且一致性级别为 LOCAL_QUORUM 的单个本地数据中心群集中,单个密钥查询将转到两个节点,但如果查询使用 IN 条件,则查询的节点数很可能更高,最多 20 个节点,具体取决于密钥在令牌范围内的位置。

因此,基于此,随着集群变大,这似乎会成为一个更大的问题。

因此,解决此问题(并且根本不需要使用)的最佳方法是重新考虑此查询的数据模型。在不太了解您的架构的情况下,也许存在由票证 ID 1、2、3 和 4 共享的属性(列值)。也许使用类似级别或团体的东西(如果门票是针对特定场地的),甚至可能是活动(id)。IN

基本上,虽然使用唯一的高基数标识符对数据进行分区听起来像是一个好主意,但它实际上使以后查询数据(在Cassandra中)变得更加困难。如果您可以提出一个不同的列来对数据进行分区,那么在这种情况下肯定会对您有所帮助。无论如何,创建一个新的、特定的列系列(表)来处理对这些行的查询将是比使用或多个查询更好的方法。IN


答案 2

是的,单独查询比在 Cassandra 中使用 IN 更好。

对于此查询,协调器必须从4个不同的分区中获取数据,如果每个分区都非常大,则数据在JVM中填充,这可能会导致问题。

相反,使用多个查询查询数据更好,因为每个查询都是单独的,不必等待其他分区数据将其发送回用户。


推荐