Cassandra的IN关系对查询有害吗?

给出CQL中以下select的示例:

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

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

我记得很快就看到有人在Cassandra用户邮件列表中回答了这个问题,但我现在找不到确切的消息。 具有讽刺意味的是,Cassandra Evangelist Rebecca Mills刚刚发表了一篇文章来解决这个问题( 使用Cassandra司机时你应该做的事情 ……第13和第22点)。 但答案是肯定的,在某些情况下,多个并行查询会比使用IN更快。 根本原因可以在DataStax SELECT文档中找到 。

何时不使用IN

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

因此,基于此,当集群变大时,这似乎变得更加困难。

因此,解决此问题的最佳方法(并且根本不必使用IN )将重新考虑此查询的数据模型。 在不太了解您的架构的情况下,可能存在由票证ID 1,2,3和4共享的属性(列值)。可能使用诸如级别或组之类的东西(如果票证用于特定场所)或甚至可能而是一个事件(id)。

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

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

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

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