Apache Cassandra中的二级索引

时间:2018-01-22 11:39:18

标签: apache cassandra cassandra-3.0

我尝试使用以下链接了解Cassandra中的二级索引:

假设我们有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. 使用二级索引会对其他任何性能产生影响吗? - 如果它解释了原因
  3. ,那将是伟大的

2 个答案:

答案 0 :(得分:4)

Cassandra将联系节点,直到它到达要返回的行的LIMIT,满足您的查询,或者直到它联系所有节点。它通过首先联系第一轮中的一个节点,第二轮中的两个节点,第三轮中的四个节点等来完成此操作,从包含第一个令牌的节点开始。

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

使用二级索引时要注意的一件事是,索引列的基数较高,因为这会创建大量索引,因此会占用大量磁盘空间。避免在这些列上使用二级索引。

答案 1 :(得分:1)

从评论中填写讨论内容:

最新的查询将在两个节点上执行,因为您正在提供分区密钥。通过这样做,Cassandra查询引擎可以知道数据存在于哪个确切的节点。

如果您要运行以下查询:

SELECT *
FROM user
WHERE secondaryKey = "test";

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

就像我说的那样,二级密钥是节点本地的,这意味着如果你有用户表,你的信息看起来就像那样:

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当地二级索引的作用。