Apache Ignite:索引是如何工作的?

Posted

技术标签:

【中文标题】Apache Ignite:索引是如何工作的?【英文标题】:Apache Ignite: How does the indexing work? 【发布时间】:2016-03-01 10:36:19 【问题描述】:

Apache Ignite 的索引是如何工作的?我没有在文档中找到这些技术细节。

    是否使用 B 树? 索引存储在哪里? 如何存储? 内置使用后索引提供了哪些性能(Big-O 表示法)? 构建速度有多快,什么时候构建? Ignite 可以存储任意可序列化的 Java 对象。当我想索引子子对象的字段时,它如何处理组合? Ignite Cache 是一个键值对存储。我可以将不同的类(=作为对象的类型)作为值吗?换句话说,Ignite Cache 是无模式的吗?如果是,这与我的 SQL 查询有什么关系? Ignite Cache 是一个键值对存储。如果我对我的值进行 SQL 查询,键是如何发挥作用的?我在查询什么? 键可以是任意的、可序列化的 Java 对象 - 我可以查询键还是只查询值?

【问题讨论】:

【参考方案1】:

这些信息在文档中并没有真正涵盖,因为它主要是实现细节,并且可以随版本而变化。毕竟,如果您对细节感兴趣,可以使用所有源代码。 具体来说,我说的是即将发布的 Ignite 1.5。

    在 1.5 之前,默认数据结构是 snap-tree(avl-tree 的变体),因为 1.5 还添加了跳过列表选项,现在它是默认值。 在 Java 堆或堆外内存中,具体取决于配置。 可靠 :) 我不明白这个问题。 log(N) 更新和查找。 每次提交事务时都会更新索引(或者在原子缓存的情况下仅更新缓存),没有单独的构建阶段。您可以期望每次更新后索引都处于正确状态。 Ignite 有两个选项(自 1.5 起):以允许获取单独字段值的二进制格式存储对象或保持整个对象反序列化并使用反射。 等

玩得开心!

【讨论】:

关于 6:Ignite 是否会查找整个复合对象树以找到与我的 SQL 语句中提到的名称相同的字段? 由于缓存的 SQL 模式是在任何查询之前定义的,属性访问对象是预先准备好的,因此不会发生按名称查找。 可能您没有正确设置索引,请再次阅读文档和示例。 至于按名称查找,我来解释一下。看看这里的例子github.com/apache/ignite/tree/master/examples/src/main/java/org/…。我们有 DimStore 类型,它的字段用 @QuerySqlField 注释。使用这些字段,Ignite 创建 SQL 表,因此它预先知道我们需要访问哪些字段,为每个字段准备访问对象,在查询解析后,我们将能够使用该访问对象,而无需通过名称进行任何查找。 Ignite 在模式初始化时检查对象类型,它不需要检查存储在缓存中的每个对象。因此字段访问对象只为类型初始化一次,并且可以用于该类型的任何对象。

以上是关于Apache Ignite:索引是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

索引 Apache Ignite 缓存与优化的内存 CassandraDB

Apache Ignite 的直接内存更新

Apache ignit:SQL 语句创建表中的语法错误

Solr的工作原理以及如何管理索引库

Solr的工作原理以及如何管理索引库

将 Apache Cassandra 与 Apache Ignite 集成