cassandra - cassandra中的主键和索引

标签 cassandra

cassandra 的新手,仍在学习。

create table url (
  id_website int,
  url varchar,
  data varchar,
  primary key(url, id_website)
);

嗨,我有一个网站的 url 表。

我不希望所有的 url 都在同一个节点上,这就是为什么主键首先是 url,所以它将是分区键。

大多数情况下,我会检索特定 url 的数据,例如:“url = ? and id_website = ?”

但是,当我想检索网站的部分/全部 url 时,性能如何:
select * from url where id_website = 1 allow filtering limit XX;

我认为这个查询将在所有节点上发送,然后,表扫描 id_website=1 直到达到限制,然后合并并发回我的客户端。

但是这种扫描是要使用索引并且是有效的,还是会一一读取 id_website 列的值并进行比较(所以无效)?我确实设置了主键的 id_website 部分,所以我希望它被索引,但我真的不知道。

我们在 cassandra 上是否有一些工具,例如 mysql 的 EXPLAIN 来检查查询是否使用索引。

谢谢。

--

编辑

Create a second table with id_website as partition key (and write/delete in batch)



我不想使用这个解决方案,因为我可能有一两个非常大的网站,并且有数百万个网址(以及数百万个网址很少的其他网站)。

如果我在 id_website 上有一个分区键,并且这两个或三个网站位于同一个节点上,则可能会导致存储问题,或者处理这些网站的节点可能请求过多,而另一个则一无所获。我想将数据分布在所有节点上。这就是为什么我坚持要在 url 上进行分区。

You create a secondary index on id_website (which creates a table for you)



这个解决方案怎么样?如果我理解的话,每个节点都会有一个表来索引它基于 id_website 存储的行(而不是其他节点的行)。所以我可以将我的 url 分布在许多节点上,我不会让一个节点处理包含特定网站所有 url 的大型索引。

现在当我使用我的查询
select * from url where id_website = 1 allow filtering limit XX;

每个节点接收到查询,但这次不必循环遍历分区(url列),它们可以直接在索引中查找属于id_website的url,并返回行(或不返回)。对 ?

这个解决方案的反面是每次请求完成时,它都会到达每个节点,但是,由于新的索引,它应该很快吗?

最佳答案

你走对了。使用允许过滤您只是要求 cassandra 扫描所有节点:非常无效。 id_website在每个分区中都有索引,但是由于您没有告诉 Cassandra 去哪里,他必须点击所有分区(所有节点),即使是那些不包含所选 id_website 信息的分区。 -- 一旦 Cassandra 命中一个分区就知道如何查找这些信息,并且不需要扫描整个分区来取回数据。

要在 Cassandra 中解决这个问题,您必须进行非规范化,在这种情况下,您可以通过两种可能的方式来解决:

  • 创建以 id_website 作为分区键的第二个表(并批量写入/删除)
  • 您在 id_website 上创建二级索引(为您创建一个表)

  • **根据问题编辑**

    你说的是对的:二级索引作为“本地索引”处理——每个节点只为它拥有的数据创建一个本地索引表。以下是good reading关于二级索引(您已经了解)

    创建索引后,您必须删除 ALLOW FILTERING从查询。

    高温下,
    卡罗

    关于cassandra - cassandra中的主键和索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26506545/

    相关文章:

    java - Spark java API 中使用 Spark cassandra-connector 读取数据时出现的问题

    Cassandra : can't assign requested address at

    Cassandra: "cqlsh"第 145 行,除了 ImportError,e:^ SyntaxError:语法无效

    java - 禁止 Cassandra 使用客户端时间戳

    java - Spring JPA : PropertyReferenceException: No property findAll found for type

    hadoop - 大数据 - Lambda 架构和存储原始数据

    cassandra - 我可以将 Apache cassandra 节点添加到 DataStax (DSE) cassandra 集群吗?

    apache-spark - PySpark + Cassandra : Getting distinct values of partition key

    cassandra - 使用 PlayOrm 读取查询确实会返回适当的结果

    cassandra - 更新后运行nodetool upgradesstables的最佳方法?