【问题标题】:Cassandra index explainedCassandra 指数解释
【发布时间】:2017-05-10 15:12:48
【问题描述】:

好的,我一直在寻找解释,但仍然找不到答案。

当我们谈到 Cassandra 索引时,我得到了要点,其中是:

  • 不要用于高基数或非常低基数的数据

在低基数上我明白了 - 搜索时我们会得到非常宽的行。

但是对于高基数数据,幕后会发生什么?所有书籍和博客似乎都复制了 datastax 示例,它没有解释为什么,只是告诉你不要这样做。

假设,我想在用户电子邮件上创建一个索引。如果我理解正确,当我通过电子邮件搜索用户时,会发生两件事:

  1. 询问所有节点,哪个具有与此电子邮件相关的用户 ID
  2. 通过用户ID从正确的分区获取用户

如果我在用户国家创建索引(这似乎是更合适的字段),算法应该是相同的。

所以,请解释一下我在理解为什么对高基数数据使用索引不好时所缺少的内容。

另外,关于相关主题:是否存在索引比物化视图更受青睐的情况?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    总结: 当你知道分区键时使用索引,你需要做一个必须命中所有节点的全文搜索,或者做一些事情,例如,你看过多少次在博客中发布的所有文章(必须击中所有节点)并且您需要特定值,例如:

     WHERE age = 18
    

    当你不知道分区键并且你需要像这样的范围时使用物化视图:

    WHERE age > 18 and age < 30
    

    参考资料:

    主要文章!

    Cassandra Secondary Index Preview #1

    这是物化视图和二级索引的比较

    Materialized View Performance in Cassandra 3.x

    这里是已知 PK 使用索引更有效的地方

    Cassandra Native Secondary Index Deep Dive

    【讨论】:

      【解决方案2】:

      假设您在电子邮件等高基数列上创建索引。
      如果您通过电子邮件查询用户 ID,cassandra 需要在所有主机上执行该查询以获取该单个用户 ID。您正在查询所有主机以获取单个用户 ID,这不是很昂贵吗?

      如果你想创建一个像下面这样的表格

      CREATE TABLE userid_by_email (
          email text PRIMARY KEY,
          userid bigint
      );
      

      Cassandra 将通过在单个主机上查询来返回用户 ID。

      这是你的另一个问题的答案https://stackoverflow.com/a/36476772/2320144

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2016-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多