为什么Cassandra没有二级索引?

时间:2019-05-22 11:29:12

标签: cassandra

Cassandra被定位为可扩展的快速数据库。 从技术细节上讲,为什么我不能通过二级索引来实现上述目标?

2 个答案:

答案 0 :(得分:2)

Cassandra确实具有二级索引。但是二级索引的用法不适用于分布式数据库,这是因为每个节点仅占整个数据集的一个子集。

我之前写过一个答案,其中讨论了二级索引查询的基本细节:

How do secondary indexes work in Cassandra?

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

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

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

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

答案 1 :(得分:0)

因此,是的,cassandra确实具有二级索引,而aaron的解释在解释其原因方面做得很好。

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

cassandra的一些最新迭代通过实例化视图实现了“内置”。从3.0.11开始,我还没有真正使用过它们,但是它们很有希望。我当时遇到的问题主要是将它们添加到具有现有数据的表中,并且它们的写入开销非常大(延迟增加)。