是否有可能在Cassandra中创建独特的二级索引?

时间:2016-03-03 10:16:36

标签: cassandra

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

3 个答案:

答案 0 :(得分:2)

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

有一些limitations使用此功能,因为Cassandra必须为您进行大量的簿记,以便使物化视图保持最新。

答案 1 :(得分:1)

当然有可能。问题是它会表现得非常糟糕。

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

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

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

Apple的Richard Low写了一篇关于这个主题的精彩文章:The Sweet Spot for Cassandra Secondary Indexing。给那个读。

答案 2 :(得分:1)

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

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

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

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

    • 其他块写...

  • 要获取join / where功能,请在列值上创建索引(在原始表中)。

丑陋,如果客户决定忽略合同,则不起作用,但是否则有效,如果它是如此小的表,也应该非常快。

相关问题