【问题标题】:Is it possible to create unique secondary index in Cassandra?是否可以在 Cassandra 中创建唯一的二级索引?
【发布时间】:2016-03-06 19:16:41
【问题描述】:

根据我的阅读,我看不到任何指定唯一性约束的选项。我想知道这是否可能?将列更改为主键还需要更改其他一些表。这就是为什么我要问是否有可能有一个唯一的二级索引?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    Cassandra 3.0 中的materialized views 功能旨在帮助解决这个问题。您可以在唯一的辅助列上创建具体化视图,以便您可以使用该列作为主键查询视图。

    有一些 limitations 使用此功能,因为 Cassandra 必须在后台为您做很多簿记,以使物化视图保持最新。

    【讨论】:

      【解决方案2】:

      当然可以。问题是它会表现得很糟糕。

      Cassandra 将在后台创建一个引用每个索引值和行的表。每个节点将在本地存储自己的索引部分。所以你的索引基本上和你的原始表一样多的行,除了它不会被分发。

      最后一部分是关键。当您查询该索引时,您将在等式中引入网络延迟,因为需要查询每个节点以查看它是否包含索引值。

      这就是二级索引很烂的原因。高基数指数更糟糕。此解决方案在分布式环境中失败,因为它无法扩展。

      Apple 的 Richard Low 就这个主题写了一篇很棒的文章:The Sweet Spot for Cassandra Secondary Indexing。读一读。

      【讨论】:

      • 我明白你的意思。我目前面临的情况是我们使用 Cassandra 作为所有表的唯一数据存储。有些表会有数百万行,但我所说的这个表不会超过 1000 行。因此,我想了解的是,仅将此表保留在 cassandra 中并在我需要查询的列上具有二级索引或将此类表移动到其他数据存储是否是一种好习惯?
      【解决方案3】:

      AFAIK,Cassandra 不支持列的唯一性,v2 中有 lightweight transactions 在行级别上工作 - 此块写入现有键,否则它将被覆盖(即唯一性是作为主键显然)。这些不适用于列值。

      但是您可以在客户端中使用应用程序逻辑来实现它...

      • 创建一个附加表,其中键是列值
      • 修改写操作为先查询新表中的列值

        • 如果已经存在(使用轻量级事务或简单读取),则阻止向另一个表插入新行(因此,原始表的每次写入/更新/删除都与列值表相关联) .

        • 其他块写入...

      • 要获得连接/位置功能,请在列值上创建索引(在原始表中)。

      丑陋,如果客户决定忽略合同,它就不起作用,但否则会起作用,而且如果它是一张这么小的桌子,也应该很快。

      【讨论】:

        猜你喜欢
        • 2015-02-15
        • 2018-05-04
        • 1970-01-01
        • 2013-12-04
        • 1970-01-01
        • 1970-01-01
        • 2016-09-20
        • 2011-11-30
        • 2013-01-27
        相关资源
        最近更新 更多