【问题标题】:Querying Cassandra by a partial partition key通过部分分区键查询 Cassandra
【发布时间】:2015-02-01 07:53:55
【问题描述】:

在 Cassandra 中,我可以创建一个复合分区键,与我的集群键分开:

CREATE TABLE footable (
    column1 text,
    column2 text,
    column3 text,
    column4 text,
    PRIMARY KEY ((column1, column2))
)

据我了解,按分区键查询是一种极其有效(最有效?)的数据检索方法。但是,我不知道仅通过复合分区键的一部分进行查询是否也有效。

在 MSSQL 中,这将是有效的,只要从第一个开始包含组件(在此示例中是 column1 而不是 column2)。卡桑德拉也是这样吗?在这里仅根据 column1 查询行是否高效?

【问题讨论】:

  • 如果您只想查询部分主键,您可以将其定义为 PRIMARY KEY (column1, column2)。但是,这意味着分区(存储数据的位置)仅由 column1 确定。这可能会导致热节点或其他问题,具体取决于 column1 的基数。如果您提供有关架构的更多详细信息(特别是 column1 和 column2 代表的内容),我们或许可以为您建议一个有效的中间立场。
  • 我在这里寻找更多的一般策略,而不是特定的建议。然而,我的实际问题不是我最终会遇到热点,而是我可能会在某个时候超过约 20 亿列的限制,因为我还使用了集群键(时间戳)。跨度>
  • @mildewey 也很清楚,我问的是基于 partition 键的一部分而不是 primary 键的一部分的查询.在某种程度上,可以在分区键的最后部分使用 IN 子句。这对我的用例来说已经足够了。

标签: cassandra cql cassandra-2.0


【解决方案1】:

在 Cassandra 中并非如此,因为这是不可能的。这样做会产生以下错误:

必须限制分区键部分实体,因为前面的部分是

查看 DataStax MVP Robbie Strickland 的 Cassandra 2014 SF 峰会演示文稿,标题为“CQL Under the Hood”。幻灯片 62-64 显示完整的分区键用作行键。使用 Cassandra 中的复合分区键,您必须查询所有行键,或者一个都不查询。

您可以观看complete presentation video here

【讨论】:

    【解决方案2】:

    这在 Cassandra 中是不可能的,因为它需要全表扫描来解决这样的查询。分区的位置由组合键的所有成员的散列定义,这意味着只给出一半的键与不给出它一样好。查找记录的唯一方法是搜索所有键并检查它们是否匹配。

    【讨论】:

    • “只给一半的钥匙和不给它一样好” - 说得好!
    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2016-05-11
    • 2016-06-04
    • 1970-01-01
    相关资源
    最近更新 更多