java - Cassandra 中的 IN 关系对查询不利吗?

标签 java database database-design cassandra cql

以 CQL 中的以下选择为例:

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

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

最佳答案

我记得不久前在 Cassandra 用户邮件列表中看到有人回答了这个问题,但我现在找不到确切的消息。具有讽刺意味的是,Cassandra Evangelist Rebecca Mills 刚刚发表了一篇文章来解决这个问题(Things you should be doing when using Cassandra drivers ...第 13 点和第 22 点)。但答案是肯定的,在某些情况下,多个并行查询比使用 IN 更快。根本原因可以在 DataStax SELECT documentation 中找到.

When not to use IN

...Using IN can degrade performance because usually many nodes must be queried. For example, in a single, local data center cluster with 30 nodes, a replication factor of 3, and a consistency level of LOCAL_QUORUM, a single key query goes out to two nodes, but if the query uses the IN condition, the number of nodes being queried are most likely even higher, up to 20 nodes depending on where the keys fall in the token range.

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

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

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

关于java - Cassandra 中的 IN 关系对查询不利吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26999098/

相关文章:

java - JOptionPane 当我点击 "Ok"时如何阻止它关闭

java - 无法从jms队列接收消息

java - JOGL颠倒渲染

PHP 代码没有从数据库中获取正确的值

sql - 创建表时在 SQL 中断言某些条件的最佳实践?

Java - Servlet post 参数编码错误

arrays - Meteor mongo更新嵌套数组

mysql - 如何在 SQL/SQLalchemy 中对多条记录使用 join 和 order_by?

database-design - 多层次项目

PostgreSQL:具有多个条件的多个 LEFT JOIN