Indexing 在Cassandra中考虑二级索引的高可用性和性能

Indexing 在Cassandra中考虑二级索引的高可用性和性能,indexing,cassandra,cassandra-3.0,Indexing,Cassandra,Cassandra 3.0,我有一个设置:5个Cassandra节点集群,RF=3,我为表“user”中的一列执行了二级索引 1根据我对使用链接的二级索引的研究:我知道二级索引将存储在本地节点中。这是否意味着在五节点集群中,只有一个节点的二级索引可用?如果不在RF=3 for user表中,那么辅助索引表在多少节点中可用 2以下两个查询在执行上有什么不同 CREATE TABLE user( user_group int PRIMARY KEY, user_name text, user_ph

我有一个设置:5个Cassandra节点集群,RF=3,我为表“user”中的一列执行了二级索引

1根据我对使用链接的二级索引的研究:我知道二级索引将存储在本地节点中。这是否意味着在五节点集群中,只有一个节点的二级索引可用?如果不在RF=3 for user表中,那么辅助索引表在多少节点中可用

2以下两个查询在执行上有什么不同

   CREATE TABLE user(
    user_group int PRIMARY KEY,
    user_name text,
    user_phone varint
   );

  CREATE INDEX username_idx ON user (user_name);
在这个表格设置中

查询1:从user_name='test'中选择*FROM user

查询2:从user_group=1和user_name=test的用户中选择*

上述两个查询将通过5节点集群中的多少节点执行,以及这两个查询在性能上有何不同

编辑:

假设我有一张像下面这样的桌子

CREATE TABLE nodestat (
    uniqueId text,
    totalCapacity int,
    physicalUsage int,
    flashMode text,
    timestamp timestamp,
    primary key (uniqueId, timestamp)) 
    with clustering order by (timestamp desc);

CREATE CUSTOM INDEX nodeIp_idx ON nodestat(flashMode)
查询3:从nodestat中选择*,其中uniqueId='test'和flashMode='yes'

在这种情况下,表中总是只有一个分区,那么二级索引搜索与没有分区键的二级索引相比有什么不同呢?它的效率有多高

记录您的问题1:

这是否意味着在五节点集群中,只有一个节点的二级索引可用

二级索引在集群的每个节点中都可用,它建立在该节点中的数据以及该节点的本地数据之上。也就是说,它只知道该特定节点中的主键。可以将次索引想象为一个查找表,其中引用了该节点上的主键

因此,在您的案例中,每个节点都会构建自己的二级索引—所有5个节点,但不知道彼此的引用

如果不在RF=3 for user表中,那么辅助索引表在多少节点中可用

辅助索引没有复制因子,因为它对每个节点都是本地的。因为您的数据已经被复制到RF=3,所以每个节点中的二级索引都将被索引

请回答你的第二个问题:

Query 1 : SELECT * FROM user WHERE user_name = 'test';
此查询将在群集中的所有节点上执行分散聚集。由于二级索引是每个节点的本地索引,因此在您的案例中,所有5个节点都必须执行查询->执行二级索引查找以找出分区键->然后将实际结果返回给协调器

随着表变大,查询通常会导致超时。在极端情况下,它可以像select*一样关闭节点,而不使用分区键。因此,在Cassandra中一般不鼓励使用二级索引和这种没有分区键的查询,最好避免使用它们

与前一个查询相比,此查询的性能更好,因为它在分区键上具有筛选器。在上面的表定义中,没有集群列,因此该查询将只对主键进行筛选,因为每个分区只有一行。因此,二级索引没有太大的改进。总的来说,它不是分散-聚集类型的查询,因此性能更好

编辑以解释问题3

在这个查询中,辅助索引与分区键一起使用。如果给定分区键存在1000个集群列,那么这个二级索引将有所帮助,我们希望快速缩小结果集的范围。请记住,次索引存储整个主键分区键+集群列引用。因此,在宽分区的情况下,当与分区键一起使用时,这个辅助索引证明是有用的


例如,在您的例子中,假设只有一个分区uniqueId='test'。但在这个分区“test”中,假设有10000个不同的时间戳值。所以flashMode可能有10000个不同的值。这个二级索引将有助于缩小到分区“test”中10000个匹配项中值为yes的flashMode列。

我还发现,如果提供了分区键,我没有看到二级索引表的使用,据我了解,它仅用于从提供的值/搜索字符串中获取分区节点?我还了解,如果不创建索引,我们将无法对非主键值执行搜索,那么提供分区键的辅助索引有何用途?编辑了我的答案,以包括对查询3的解释。请记住,辅助索引存储整个主键分区键+集群列。因此,它将有助于在1000个可能与给定分区列匹配的群集列中缩小到确切的主键。令人敬畏的解释看起来是合理的,因此分区Id和辅助索引是一个很好的解决方案,:如果有可用的二级索引,写操作是否也会对性能产生影响?是的,维护此附加二级索引查找表会有写开销。请参阅何时索引和何时无索引
Query 2 : SELECT * FROM user WHERE user_group = 1 AND user_name = 'test';
Query 3 : select * from nodestat where uniqueId = 'test' AND flashMode = 'yes'