给定CQL中以下选择的示例:
SELECT * FROM tickets WHERE ID IN (1,2,3,4)
给定ID是分区键,使用IN关系是否比执行多个查询更好?或者没有区别?
我记得不久后有人在Cassandra用户邮件列表中回答了这个问题,但是现在我找不到确切的消息。具有讽刺意味的是,Cassandra传播者Rebecca Mills刚刚发表了一篇文章解决了这个问题(使用Cassandra驱动程序时应该做的事情……要点#13和#22)。但是答案是“是”,在某些情况下,多个并行查询要比使用an更快IN
。根本原因可以在DataStax SELECT文档中找到。
何时不使用IN
...使用IN可能会降低性能,因为通常必须查询许多节点。例如,在一个具有30个节点,复制因子为3且一致性级别为LOCAL_QUORUM的单个本地数据中心群集中,单个键查询针对两个节点,但是如果查询使用IN条件,则将被查询的节点可能更高,最多可达20个节点,具体取决于密钥在令牌范围内的位置。
因此,基于此,随着群集的扩大,似乎这将成为一个更大的问题。
因此,解决此问题的最佳方法(根本不必使用IN
)是重新考虑此查询的数据模型。在不了解您的架构的情况下,也许有票证ID 1、2、3和4共享的属性(列值)。也许使用了诸如关卡或组(如果票证用于特定场所)之类的东西,甚至而是一个事件(id)。
基本上,虽然使用唯一的高基数标识符对数据进行分区听起来不错,但实际上,以后(在Cassandra中)查询数据会变得更加困难。如果您可以提出另一列来对数据进行分区,那么在这种情况下肯定会对您有所帮助。无论如何,创建一个新的特定列族(表)来处理这些行的查询将是比使用IN
或多个查询更好的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句