Apache Cassandra 中的二级索引

Secondary index in Apache Cassandra

我尝试使用以下方法理解 Cassandra 中的二级索引 link:

假设我们有 5 个节点 N1、N2、N3、N4 和 N5 集群,复制因子为 3,这意味着分区数据将被复制到集群中的 3 个节点(比如 N1、N2 和 N3)。

现在当我执行这个查询时:

SELECT *
FROM user
WHERE partitionKey = "somedata" AND ClusteringKey = "test";

读取一致性为“2”

它将从节点N1、N2或N3中的任意两个节点进行查询

如果我在任何列上应用二级索引,下面的查询将执行多少个节点?

SELECT *
FROM user
WHERE partitionKey = "somedata" AND secondaryKey = "test";

我有两个问题:

  1. 根据视频,上述对二级索引的查询将从集群中的所有 5 个节点读取以在 secondaryIndexColumn 上进行搜索?这是正确的吗?
  2. 使用secondary Index是否会对性能产生其他影响? - 如果能解释原因就太好了

通过评论补充讨论:

两个最新查询都将在两个节点上执行,因为您要提供分区键。通过这样做,Cassandra 查询引擎可以知道数据所在的确切节点。

如果您要运行以下查询:

SELECT *
FROM user
WHERE secondaryKey = "test";

这将 运行 在你的 table 中有数据的所有节点中,并且必须根据该辅助键扫描每个节点。

就像我说的,辅助键是节点本地的,这意味着如果你有用户 table 并且你的信息看起来像这样:

user_id  user_name
---------------------------
1        a_very_cool_user
2        a_very_cooler_user
3        the_coolest_user

因此,如果我们将此数据分成三个分区,假设这三个节点中的每一个都只有一行:

  • 节点 1 会 a_very_cool_user
  • 节点 2 会 a_very_cooler_user
  • 节点 3 会 the_coolest_user

并且如果您要索引 user_name 字段,那么节点 1 只会索引 a_very_cool_user 而不知道其他两个节点中的内容。同样适用于其他的。这就是本地二级索引在 Cassandra 中所做的。

Cassandra 将联系节点,直到它达到 return 行的 LIMIT 行,满足您的查询,或者直到它联系所有节点。它首先在第一轮联系一个节点,在第二轮联系两个节点,在第三轮联系四个节点,依此类推,从包含第一个令牌的节点开始。

您可以在本文(E 部分)中查看完整算法:https://www.datastax.com/dev/blog/cassandra-native-secondary-index-deep-dive

使用二级索引时要注意的一件事是索引列是否具有高基数,因为这将创建大量索引,从而使用大量磁盘 space。避免在这些列上使用二级索引。