And*_*ung 10 java database database-design cql cassandra
给出CQL中以下select的示例:
SELECT * FROM tickets WHERE ID IN (1,2,3,4)
Run Code Online (Sandbox Code Playgroud)
给定ID是一个分区键,使用IN关系比做多个查询更好还是没有区别?
Aar*_*ron 20
我记得很快就看到有人在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或多个查询更好.