【问题标题】:Is the IN relation in Cassandra bad for queries?Cassandra 中的 IN 关系对查询不利吗?
【发布时间】:2015-01-15 22:10:08
【问题描述】:

以 CQL 中的以下选择为例:

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

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

【问题讨论】:

    标签: java database database-design cassandra cql


    【解决方案1】:

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

    何时不使用 IN

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

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

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

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

    【讨论】:

    • delete 查询呢?我目前有一个查询DELETE FROM xyz WHERE pkey IN(1,2,3,4)。用于 DELETE 的 IN 运算符是否比 SELECT 更好?
    • @pinkpanther 这取决于您是否关心删除操作的执行情况。如果您有多个节点,我认为同样的性能问题会发生在您身上。但是,如果您只是进行一次性维护删除,那我就不用担心了。
    • 建议在更高基数的分区键下合并记录有利于优化 IN 查询,但是您必须注意分区大小。最佳位置是 100MB 左右,所以如果您的分区变得比这大得多,您应该考虑另一种拆分方式。由于数据模型是 Cassandra 性能的最大决定因素,因此我建议从 DataStax Academy 获取data modeling course
    • @User3518958 如果您提供分区键并在集群键上使用IN,您将受益于仅通过点击一个节点即可检索数据。但是,您仍然会强制 Cassandra 随机(而不是按顺序)读取 in 分区。这种查询的性能在很大程度上取决于分区大小和集群键的数量。
    • 好的,明白了,'你仍然会强制 Cassandra 在分区内随机(而不是按顺序)读取',这很好,谢谢
    【解决方案2】:

    是的,单独查询比在 Cassandra 中使用 IN 更好。

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 2010-11-04
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 2020-03-30
      • 2019-05-30
      相关资源
      最近更新 更多