当前位置: 首页 > 面试题库 >

Cassandra中的IN关系是否对查询不利?

淳于凯
2023-03-14
问题内容

给定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或多个查询更好的方法。



 类似资料:
  • 以CQL为例选择如下: 给定ID是一个分区键,使用IN关系比执行多个查询更好,还是没有区别?

  • 实现了一对多的关系,它运行良好。 我的问题是当我运行下面的查询时,如果表有100个员工行,每个员工有两个部门。数据库查询被调用了101次,因为对每个员工都是调用部门查询,要完成调用全部100行需要很长时间,有没有人可以提出替代的解决方案? 输出XML:

  • 我正在读MongoDB在行动这本书。我有一个关于的问题。 在中,该书给出了一个多对多关系的示例。它给出了文档和文档。 我理解这里的多对多关联。基本上,可以有一个带有_id等数组的键。所以我不想问类似MongoDB多对多关联的问题 我的问题是关于的,书中给出了关于查询多对多关系的两个示例查询。下面是两个查询: > 是什么意思?我以为只存在于Ruby驱动程序中。 中的是什么?是收藏吗? 中的是什么?

  • 我想查询表的完整分区。我的复合分区键由组成和是字符串,是整数。 我需要将hour_of_timestamp字段添加到我的分区键,因为在摄取数据时存在热点。 现在我想知道查询数据的完整分区的最有效方法是什么?根据这个博客,使用会在协调器节点上造成大量开销。 使用TOKEN函数并用两个TOKEN查询分区是否更好?如<代码> SELECT * from my table WHERE TOKEN(id,d

  • 我在Eclipselink2.3.2中使用JPA2.0,在其中,我在产品和它们的颜色之间建立了多对多的关系。一个产品可以有多种颜色,一种颜色可以与多种产品相关联。这种关系在数据库中由三个表表示。 null 很明显,实体类有一组颜色-,它被命名为。 实体类有一组产品-,它被命名为。 我需要根据提供的与表中的颜色不匹配的从表中获取颜色列表。 对应的JPQL如下所示。 它生成以下SQL语句。 因为这将是

  • 本文向大家介绍MyBatis中多对多关系的映射和查询,包括了MyBatis中多对多关系的映射和查询的使用技巧和注意事项,需要的朋友参考一下 先说一下需求:  在页面上显示数据库中的所有图书,显示图书的同时,显示出该图书所属的类别(这里一本书可能同时属于多个类别) 创建表:  笔者这里使用中间表连接图书表和图书类别表,图书表中没有使用外键关联图书类别表  而是在中间表中引用了图书主键和类别主键  通