apachecassandra中的二级索引

apachecassandra中的二级索引,cassandra,cql,cassandra-3.0,Cassandra,Cql,Cassandra 3.0,我试图通过以下链接了解Cassandra中的二级索引: 假设我们有5个节点N1、N2、N3、N4和N5集群,复制因子为3,这意味着分区数据将复制到集群中的3个节点,即N1、N2和N3 现在,当我执行此查询时: 挑选* 来自用户 其中partitionKey=somedata,ClusteringKey=test; 读取一致性为“2” 它将从任意两个节点N1、N2或N3进行查询 如果在任何列上应用二级索引,将执行以下查询的节点数是多少 挑选* 来自用户 其中partitionKey=somedat

我试图通过以下链接了解Cassandra中的二级索引:

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

现在,当我执行此查询时:

挑选* 来自用户 其中partitionKey=somedata,ClusteringKey=test; 读取一致性为“2”

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

如果在任何列上应用二级索引,将执行以下查询的节点数是多少

挑选* 来自用户 其中partitionKey=somedata,secondaryKey=test; 我对此有两个疑问:

根据视频,上述关于二级索引的查询将从集群中的所有5个节点读取,以便在secondaryIndexColumn上进行搜索?对吗? 使用二级索引是否会对性能产生任何其他影响?-如果能解释原因那就太好了
根据评论填写讨论内容:

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

如果要运行以下查询:

挑选* 来自用户 其中secondaryKey=测试; 这将在表中包含数据的所有节点中运行,并且必须基于该辅助键扫描每个节点

正如我所说,辅助键是节点的本地键,这意味着如果您有users表,并且您的信息看起来会像这样:

user_id  user_name
---------------------------
1        a_very_cool_user
2        a_very_cooler_user
3        the_coolest_user
因此,如果我们将此数据划分为三个分区,则假设这三个节点中的每一个都只有一行:

节点1会有一个非常酷的用户 节点2将有一个非常酷的用户 节点3将拥有最酷的用户
如果要索引user\u name字段,那么节点1只会索引一个非常酷的用户,而不知道其他两个节点中有什么。其他的也一样。这就是本地二级索引在Cassandra中的作用。

要从评论中填充讨论:

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

如果要运行以下查询:

挑选* 来自用户 其中secondaryKey=测试; 这将在表中包含数据的所有节点中运行,并且必须基于该辅助键扫描每个节点

正如我所说,辅助键是节点的本地键,这意味着如果您有users表,并且您的信息看起来会像这样:

user_id  user_name
---------------------------
1        a_very_cool_user
2        a_very_cooler_user
3        the_coolest_user
因此,如果我们将此数据划分为三个分区,则假设这三个节点中的每一个都只有一行:

节点1会有一个非常酷的用户 节点2将有一个非常酷的用户 节点3将拥有最酷的用户
如果要索引user\u name字段,那么节点1只会索引一个非常酷的用户,而不知道其他两个节点中有什么。其他的也一样。这就是本地二级索引在Cassandra中的作用。

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

您可以在本文的E部分检查完整的算法:


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

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

您可以在本文的E部分检查完整的算法:


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

您是通过partitionKey进行查询的,因此Cassandra已经知道要查询哪些节点,否?否,根据视频,如果我不使用二级索引,他提到,如果我们使用二级索引,那么它会在复制因子的所有节点上进行查询,而不考虑读取一致性。这是真的吗?你试过这个吗?就像我想的那样。使用辅助键意味着对它们运行查询。例如,从次_键=12345的用户中选择*;这将是一次散聚。按分区键查询仍将使用主键而忽略secon
二级索引是特定节点的本地索引。若通过辅助索引键进行查询,则查询引擎不知道这些键值存在于何处以及在哪些节点上。RC只需要至少启动并运行两个节点。但如果您通过二级索引搜索查询,就像询问集群我在哪里可以找到这些数据,因为我没有通过主键搜索。然后,它在该列上创建索引并提供来自所有可能节点的数据,这会降低您通过partitionKey查询的性能,因此Cassandra将已经知道要查询哪些节点,不?不,如果我不使用辅助索引,根据视频,他提到,如果我们使用二级索引,那么它会在复制因子的所有节点上进行查询,而不考虑读取一致性。这是真的吗?你试过这个吗?就像我想的那样。使用辅助键意味着对它们运行查询。例如,从次_键=12345的用户中选择*;这将是一次散聚。按分区键查询仍将使用主键而忽略次索引。次索引是该特定节点的本地索引。若通过辅助索引键进行查询,则查询引擎不知道这些键值存在于何处以及在哪些节点上。RC只需要至少启动并运行两个节点。但如果您通过二级索引搜索查询,就像询问集群我在哪里可以找到这些数据,因为我没有通过主键搜索。然后,它在该列上创建索引,并提供来自所有可能节点的数据,这会降低性能我接受他的答案,因为他提供的链接清楚地解释了这一概念:我在Cassandra上发布了两个问题,请您帮助我:我接受他的答案,由于他提供的链接清楚地解释了这个概念:我在Cassandra上发布了两个问题,请您帮助我: