我有 设置 :5个Cassandra节点群集,RF = 3,我为表'user'中的列执行了二级索引,
1)根据我对二级索引的研究使用链接:https://www.datastax.com/dev/blog/cassandra-native-secondary-index-deep-dive我理解二级索引将存储在本地节点中。这是否意味着在五个节点集群中只有一个节点中的二级索引可用?如果不在用户表的RF = 3中,那么二级索引表可用的节点数是多少?
2)以下两个查询在执行方面有何不同?
CREATE TABLE user(
user_group int PRIMARY KEY,
user_name text,
user_phone varint
);
CREATE INDEX username_idx ON user (user_name);
在此表格设置中,
查询1 :SELECT * FROM user WHERE user_name ='test';
查询2 :SELECT * FROM user WHERE user_group = 1 AND 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'AND flashMode ='yes'
所以在这种情况下,我在表中只有一个分区,那么二级索引搜索与没有分区键的二级索引相比有何不同?效率如何?
答案 0 :(得分:3)
重新审核你的问题1:
这是否意味着在五个节点集群中只有一个节点中的二级索引可用?
二级索引在群集的每个节点中都可用,它基于该节点中的数据构建,并且只是该节点的本地数据。也就是说,它只知道该特定节点中的主键。您可以将辅助索引想象成一个查找表,其中包含对该节点上主键的引用。
所以每个节点都建立自己的二级索引(在你的情况下全部为5),但不知道彼此的引用。
如果用户表中没有RF = 3,那么二级索引表有多少个节点可用?
辅助索引没有复制因子,因为它对每个节点都是本地的。由于您的数据已经被复制RF = 3,因此每个节点中的二级索引都将编入索引。
注意你的问题2:
Query 1 : SELECT * FROM user WHERE user_name = 'test';
此查询将在群集中的所有节点上执行分散收集。由于二级索引是每个节点的本地索引,因此每个节点(在您的情况下全部为5)都必须执行查询 - >执行二级索引查找以找出分区键 - >然后将实际结果提取回协调员。
随着表变大,查询通常会导致超时。在极端情况下,它可以关闭节点(就像没有分区键的“select *”)。 因此,Cassandra一般不鼓励二级索引和这种类型的查询(没有分区键),最好避免使用它们
Query 2 : SELECT * FROM user WHERE user_group = 1 AND user_name = 'test';
此查询与前一个查询相比性能更好,因为它在分区键上有过滤器。在上面的表定义中没有聚类列,因此该查询只会过滤主键,因为每个分区只有一行。因此二级指数没有太大改善。总的来说,它不是分散聚集类型的查询,因此表现更好。
编辑解释query3
Query 3 : select * from nodestat where uniqueId = 'test' AND flashMode = 'yes'
在此查询中,辅助索引与分区键一起使用。如果给定分区键存在1000个聚类列,并且我们希望快速缩小结果集,则此辅助索引将有所帮助。请记住,辅助索引存储整个主键(分区键+群集列引用)。因此,在广泛分区的情况下,当与分区键一起使用时,此二级索引证明是有用的。
例如,在您的情况下,假设只有一个分区uniqueId ='test'。但是在该分区'test'中,假设有10000个不同的时间戳值(聚类列)。因此,“flashMode”可能有10000个不同的值。这个二级索引将有助于缩小到“flashMode”列,在10000次匹配中分区“test”中的值为“yes”。