当前位置: 首页 > 知识库问答 >
问题:

二级索引在Cassandra中是如何工作的?

申屠无尘
2023-03-14
CREATE TABLE update_audit (
  scopeid bigint,
  formid bigint,
  time timestamp,
  record_link_id bigint,
  ipaddress text,
  user_zuid bigint,
  value text,
  PRIMARY KEY ((scopeid, formid), time)
  ) WITH CLUSTERING ORDER BY (time DESC)
CREATE INDEX update_audit_id_idx ON update_audit (record_link_id);

CREATE INDEX update_audit_user_zuid_idx ON update_audit (user_zuid);
CREATE TABLE update_audit_id_idx(
    record_link_id bigint,
    scopeid bigint,
    formid bigint,
    time timestamp
    PRIMARY KEY ((record_link_id), scopeid, formid, time)
);

CREATE TABLE update_audit_user_zuid_idx(
    user_zuid bigint,
    scopeid bigint,
    formid bigint,
    time timestamp
    PRIMARY KEY ((user_zuid), scopeid, formid, time)
);

考虑以下查询:

select * from update_audit where scopeid=35 and formid=78005 and record_link_id=9897;
  1. 该查询将如何在Cassandra中“在引擎盖下”执行?
  2. 高基数列索引(record_link_id)将如何影响其性能
  3. Cassandra会为上述查询接触所有节点吗?为什么?
  4. 先执行哪个条件,基表partition_key还是辅助索引partition_key?Cassandra将如何将这两个结果相交?

共有1个答案

王才英
2023-03-14
select * from update_audit where scopeid=35 and formid=78005 and record_link_id=9897;

上面的查询将如何在Cassandra内部工作?

实际上,分区scopeid=35formid=78005的所有数据都将返回,然后由record_link_id索引进行筛选。它将查找9897record_link_id条目,并尝试匹配与返回的行匹配的条目,其中scopeid=35formid=78005。将返回分区键和索引键的行的交集。

高基数列(record_link_id)索引将如何影响上述查询的查询性能?

不是。它应该只触及负责scopeid=35formid=78005分区的节点。索引同样存储在本地,只包含对本地节点有效的条目。

在高基数列上创建索引将是最快和最好的数据模型

这里的问题是这种方法不能伸缩,如果update_audit是一个大型数据集,这种方法将会很慢。MVP Richard Low有一篇关于二级索引(Cassandra二级索引的最佳位置)的文章,特别是关于这一点:

现在,您首先使用特定分区进行限制的方法将会有所帮助(因为您的分区肯定应该适合内存)。但我觉得这里性能更好的选择是将record_link_id设置为集群键,而不是依赖于辅助索引。

编辑

当有数百万用户时,即使我们提供了主键,在低基数索引上使用索引如何扩展

请考虑以下图表,摘自Java驱动程序文档(V3.6):

基本上,分页将导致查询自行分解并返回到集群以进行下一次结果迭代。超时的可能性较小,但性能会随着总结果集的大小和集群中节点的数量而下降。

TL;DR;分布在更多节点上的html" target="_blank">请求结果越多,所需时间就越长。

 类似资料:
  • 问题内容: 我是python的新手。这似乎是一个基本问题。但我真的很想了解这里发生了什么 索引每个数据帧中的第一个元素 疑问1:为什么会这样?为什么myseries_three [0]给我一个keyError?调用myseries_one [0],myseries_one [0]或myseries_three [0]是什么意思?以这种方式调用是否意味着我们以行名进行调用? 疑问2:-Python中

  • 问题内容: 我对MySQL索引的工作方式非常感兴趣,更具体地说,它们如何在不扫描整个表的情况下返回请求的数据? 我知道这是题外话,但是如果有人可以向我详细解释一下,我将非常非常感谢。 问题答案: 基本上,表上的索引的作用类似于书中的索引(这就是名称的来源): 假设您有一本关于数据库的书,并且想要查找有关存储的信息。没有索引(假设没有其他帮助,例如目录),则必须逐个浏览页面,直到找到主题(即)为止。

  • SDS 的二级索引支持局部二级索引与及全局二级索引,目前这两种索引都是强一致的索引 局部二级索引 使用局部二级索引必须要定义实体组键,由一个到多个表属性组成, 索引分为Lazy,Eager和Immutable三种类别 Lazy索引 -写入时同时写入索引记录,但是不会立马删除已无效的索引记录,需要等到读取时,读到无效的索引记录再删除,写效率高而读效率较低,所以此类型索引适合写多读少的场景,不支持投影

  • 问题内容: 这个问题在python中: 第一次打印给出0,第二次打印给出p 我不知道为什么,如果您能给出解释,将不胜感激。 谢谢那些帮助的人:) 问题答案: 索引从开始。所以战列舰包含索引项,,,。 首先获取列表列表的长度,即4。 通过索引值访问列表中的项目。因此,第一次调用该函数: 这是哪个是哪个

  • 我在一本书《做二进制搜索》中看到了这个方法,但无论我怎么尝试,我都无法理解它是如何工作的。有人能确切地向我解释一下它是如何工作的吗? 这本书的解释无助于: 这个想法是在我们靠近目标元素时跳跃并减慢速度。变量k和b包含数组中的位置和跳跃长度。如果数组包含元素x,搜索后x的位置将在变量k中。该算法的时间复杂度为O(log n),这是因为对每个跳转长度而言,同时循环中的代码最多执行两次。 我不明白的是k

  • 我的主键是一个名为“ID”的字段 我在表中的字段“group_number”上添加了一个辅助索引 我通过二级索引进行查询,如下所示: 然而;我得到错误“ValidationException:query condition missed key schema Element:ID” DynamoDB只允许查询主键吗?我的印象是您使用“getitem”作为主键,因为如果您使用一个主键,只有一个记录可