我尝试使用以下链接了解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";
我有两个问题:
答案 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
因此,如果我们将这些数据划分为三个分区,则假设这三个节点中的每一个只有一行:
如果你要索引user_name
字段,那么节点1只会索引a_very_cool_user并且不知道其他两个节点中的内容。同样适用于其他的。那是Cassandra当地二级索引的作用。