【问题标题】:Secondary index in Apache CassandraApache Cassandra 中的二级索引
【发布时间】:2018-07-01 00:51:54
【问题描述】:

我尝试使用以下链接了解 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. 使用二级索引是否会对性能产生任何其他影响? - 如果能解释原因就好了

【问题讨论】:

  • 你通过partitionKey查询,所以Cassandra已经知道要查询哪些节点了,不是吗?
  • 不,如果我不使用二级索引,根据视频,他提到如果我们使用二级索引,那么它会在复制因子的所有节点上进行查询,而不考虑读取一致性。这是真的吗?你试过这个吗?
  • 原来如此。使用辅助键意味着对它们运行查询。例如SELECT * FROM users WHERE secondary_key = 12345; 这将是一个分散收集。按分区键查询还是会使用主键,忽略二级索引。
  • 二级索引是该特定节点的本地索引。如果按二级索引键查询,查询引擎不知道这些键值存在于何处以及在哪些节点上。
  • RC 只需要启动并运行至少两个节点。但是,如果您通过二级索引搜索查询,就像询问集群在哪里可以找到这些数据,因为我没有通过主键搜索。然后,它在该列上创建索引并为您提供来自所有可能节点的数据,这会降低性能

标签: cassandra cql cassandra-3.0


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

填补cmets的讨论:

两个最新查询都将在两个节点上执行,因为您提供了分区键。通过这样做,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 会有一个_very_cool_user
  • 节点 2 将有一个_very_cooler_user
  • 节点 3 将拥有 the_coolest_user

如果您要索引 user_name 字段,那么节点 1 将只索引 a_very_cool_user 并且不知道其他两个节点中的内容。同样适用于其他的。这就是 Cassandra 中本地二级索引的作用。

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2016-06-29
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多