当前位置: 首页 > 知识库问答 >
问题:

卡桑德拉中的 IN 关系是否不适合查询?

方恺
2023-03-14

以CQL为例选择如下:

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

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

共有2个答案

麻宾白
2023-03-14

是的,单独查询比在卡桑德拉中使用IN更好。

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

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

郑安晏
2023-03-14

我记得不久前在Cassandra用户邮件列表中看到有人回答了这个问题,但我现在找不到确切的消息。具有讽刺意味的是,Cassandra福音传道者Rebecca Mills刚刚发表了一篇解决这个问题的文章(使用Cassandra驱动程序时应该做的事情...第13点和第22点)。但是答案是肯定的,在某些情况下,多个并行查询会比使用< code>IN更快。基本原因可以在数据税务选择文档中找到。

何时不使用 IN

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

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

因此,解决这个问题的最好方法(并且根本不必使用IN)是重新考虑此查询的数据模型。在不太了解您的模式的情况下,也许有一些属性(列值)由门票ID 1、2、3和4共享。也许可以使用级别或组(如果门票是针对特定场馆的),甚至可能是事件(id)。

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

 类似资料:
  • 我在Cassandra中有以下列系列,用于将时间序列数据存储在少量非常“宽”的行中: 在CQL外壳上,我能够运行如下查询: 从本质上讲,我修复了复合列名称的第一个组成部分的值(minute_of_day),并希望根据第二个组成部分的不同值(event_id)选择一组不连续的列。由于“IN”关系被解释为相等关系,因此这工作正常。 现在我的问题是,我如何在没有CQL的情况下以编程方式完成相同类型的复合

  • 我们运行的cassandra集群有3个节点,复制因子为2。 我们的nodejs服务器是查询这个集群的唯一地方。 是否有其他任何地方的参数设置可能导致不一致的查询? cassandra v2.2.4 nodejs驱动程序v3.0.0 编辑-添加我正在做的事情的示例: 1)检查用户名是否被占用 2)创建用户

  • 在你否决之前,我想声明,我看了所有类似的问题,但我仍然得到可怕的“主键列不能被限制”错误。 下面是我的表结构: 谢谢,德尼兹

  • 我使用的是spring数据cassandra,需要使用jpa映射一个字段,在cassandra中,该字段的类型为

  • 我们一直在使用Spark RDD API(Spark 2.0)来处理在Cassandra.Note中建模的数据,这些数据在Cassandra中建模以实现高效的读写。 然而,现在还有SparkSQLAPI,Spark DataFrame API,它也是一种替代的数据访问方法-http://spark.apache.org/docs/latest/sql-programming-guide.html

  • 全能的开发者们。我在Spark中运行一些基本的分析,在这里我查询多节点Cassandra。我正在运行的代码以及我正在处理的一些非链接代码是: Spark的版本是1.6.0,Cassandra v3。0.10,连接器也是1.6.0。键空间有,表有5列,实际上只有一行。如您所见,有两个节点(OracleVM中制作的虚拟Macine)。 我的问题是,当我测量从spark到cassandra的查询时间时,