【发布时间】:2019-10-08 21:13:37
【问题描述】:
Cassandra 定位为可扩展且快速的数据库。 为什么,我的意思是从技术细节来看,上述目标不能用二级索引来实现?
【问题讨论】:
标签: cassandra
Cassandra 定位为可扩展且快速的数据库。 为什么,我的意思是从技术细节来看,上述目标不能用二级索引来实现?
【问题讨论】:
标签: cassandra
Cassandra 确实有二级索引。但是二级索引的使用在分布式数据库中效果不佳,这是因为每个节点只保存整个数据集的一个子集。
我之前写了一个答案,讨论了二级索引查询的底层细节:
How do secondary indexes work in Cassandra?
虽然它应该有助于您对正在发生的事情有所了解,但该答案是根据分区键 first 查询的上下文编写的。这是一个重要的区别,因为在一个分区内使用二级索引应该表现良好。
问题在于,当仅通过二级索引查询时,Cassandra 无法保证您的所有数据都能够由单个节点提供服务。发生这种情况时,Cassandra 将一个节点指定为 协调器,然后依次查询所有其他节点以获取指定的索引值。
本质上,二级索引的使用不是从单个节点执行顺序读取,而是强制 Cassandra 从所有节点执行随机读取。现在您不仅有磁盘寻道时间,还有网络时间使事情变得复杂。
Cassandra 建模的建议是将数据复制到新表中以支持所需的查询。这增加了保持数据同步的其他一些复杂性。但是(如果正确完成)它可以确保您的查询确实可以由单个节点提供服务。这是您在构建模型时需要做出的权衡。您可以拥有便利或性能,但不能兼得。
【讨论】:
所以是的,cassandra 确实有二级索引,而 aaron 的解释很好地解释了原因。
您看到许多人试图通过将数据写入多个表来解决此问题。这样做是为了确保他们需要回答传统上依赖二级索引的查询的数据位于同一节点上。
最近的一些 cassandra 迭代通过物化视图“内置”了这个功能。自 3.0.11 以来我还没有真正使用过它们,但它们很有希望。我当时遇到的问题主要是将它们添加到包含现有数据的表中,并且它们的写入开销大得惊人(延迟增加)。
【讨论】: