【问题标题】:Why Cassandra doesn't have secondary index?为什么 Cassandra 没有二级索引?
【发布时间】:2019-10-08 21:13:37
【问题描述】:

Cassandra 定位为可扩展且快速的数据库。 为什么,我的意思是从技术细节来看,上述目标不能用二级索引来实现?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    Cassandra 确实有二级索引。但是二级索引的使用在分布式数据库中效果不佳,这是因为每个节点只保存整个数据集的一个子集。

    我之前写了一个答案,讨论了二级索引查询的底层细节:

    How do secondary indexes work in Cassandra?

    虽然它应该有助于您对正在发生的事情有所了解,但该答案是根据分区键 first 查询的上下文编写的。这是一个重要的区别,因为在一个分区使用二级索引应该表现良好。

    问题在于,当通过二级索引查询时,Cassandra 无法保证您的所有数据都能够由单个节点提供服务。发生这种情况时,Cassandra 将一个节点指定为 协调器,然后依次查询所有其他节点以获取指定的索引值。

    本质上,二级索引的使用不是从单个节点执行顺序读取,而是强制 Cassandra 从所有节点执行随机读取。现在您不仅有磁盘寻道时间,还有网络时间使事情变得复杂。

    Cassandra 建模的建议是将数据复制到新表中以支持所需的查询。这增加了保持数据同步的其他一些复杂性。但是(如果正确完成)它可以确保您的查询确实可以由单个节点提供服务。这是您在构建模型时需要做出的权衡。您可以拥有便利或性能,但不能兼得。

    【讨论】:

    • 感谢您的详尽回答!为什么随机读取每一行?我们可以在每个节点(每个分区)上都有类似 rdbms 的二级索引。然后就是二级索引直接搜索。不是吗?
    • 它不必查看每一行,但它必须查看每个节点上的索引存储。随机性发挥作用是因为索引机制不确定它是否会在特定节点上找到一个、多个或 any 值。但要彻底,它必须看。主要问题是它所涉及的不确定性。通过分区键查询时,Cassandra 知道哪个节点有数据,但它无法从二级索引中辨别出来。
    • 想要澄清关于 cassandra 的一件事:假设我们的复制因子为 2 。因此,一些密钥“key1”将从主节点复制到辅助节点(密钥的副本节点)。在读取操作期间,cassandra 会负载平衡请求并从主节点和辅助节点检索 key1 吗?
    • 这取决于您的一致性级别和节点可用性。如果您在 ONE 上阅读并且您的节点都已启动,它将转到负责主要范围的节点。如果该节点已关闭,它将找到辅助节点。如果你在 QUORUM 上阅读,它将从两者中读取,因为 2 的 QUORUM 是 2。
    • 但它不能轮询主节点和辅助节点的请求。
    【解决方案2】:

    所以是的,cassandra 确实有二级索引,而 aaron 的解释很好地解释了原因。

    您看到许多人试图通过将数据写入多个表来解决此问题。这样做是为了确保他们需要回答传统上依赖二级索引的查询的数据位于同一节点上。

    最近的一些 cassandra 迭代通过物化视图“内置”了这个功能。自 3.0.11 以来我还没有真正使用过它们,但它们很有希望。我当时遇到的问题主要是将它们添加到包含现有数据的表中,并且它们的写入开销大得惊人(延迟增加)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 2016-06-29
      • 1970-01-01
      相关资源
      最近更新 更多