我有一个存储项目的应用程序(例如Web文档)。每个项目都可以包含任意大量的标签。典型的常见查询是使用给定的标记集检索所有文档。嗯,一个非常常见的Web应用程序。
现在我正在考虑将NoSQL数据库作为持久存储。各种NoSQL系统(例如MongoDB)支持二级索引和基于关键字的搜索。显示如何在不同系统中执行此操作的示例很容易找到。问题是,我想知道“引擎盖下”发生了什么,即二级索引存储的方式/位置,以及如何实际执行带有标签列表的查询。特别是在具有许多节点的系统中。
我知道基于Map / Reduce或类似的解决方案。但在这里,我对索引的工作原理感兴趣。例如,我遇到的问题是:
哪里可以找到不同NoSQL系统的此类信息?非常感谢任何提示。
基督教
答案 0 :(得分:2)
在MongoDB中,标签的索引将通过利用多键功能来完成,数据库试图将文档与数组的每个元素进行匹配。您将索引给定文档的this tags属性,该属性将创建一个由该数组中的标记范围构造的btree。
您可以了解有关多键here的更多信息,并可以通过观看此演示文稿获取有关MongoDB索引的更多信息:MongoDB Internals
辅助索引是否仅存储项目/对象ID或更多?
索引由索引字段组成(假设它是您的情况下的标记数组,然后字段将是单个标记)和用于在内存中有效定位文档的偏移量。它还有一些填充+其他开销,如here
所述如果一个查询包含k个标签,那么k个子查询 - 每个标签一个 - 被执行,k个部分结果被组合成一个起始节点吗?
这取决于,但是,例如,如果查询使用$或在标记字段上,我认为查询是并行执行的,每个都在O(log n)时间内,并且结果被组合以形成结果虽然但我不确定这一点。