MongoDB内部实现索引?

时间:2016-12-31 10:36:20

标签: mongodb indexing

我学到很多东西关于索引并从中找到一些东西 这里enter link description here

  

索引支持在MongoDB中高效执行查询。没有   索引,MongoDB必须执行收集扫描,即每次扫描   集合中的文档,用于选择与之匹配的文档   查询语句。如果查询存在适当的索引,则为MongoDB   可以使用索引来限制它必须检查的文档数量。

我有一些查询:

  1. 创建索引时使用(createIndex),Is Record始终存储在 内存 ?。
  2. 每次都需要创建Index Whenever My application 将重启?
  3. 在默认ID(_id)的情况下会发生什么。始终存储在RAM中。

  4. _id是默认索引,这意味着所有记录始终存储在特定集合的RAM中?

  5. 如果我错了,请帮助我。 谢谢

2 个答案:

答案 0 :(得分:4)

我想,你知道索引存储在RAM中。如果我说他们不是,那该怎么办?

首先,我们需要了解什么是索引,索引基本上是一个指示器,告诉磁盘该文档在哪里。就像我们在书中编制索引一样,为了更快地访问,我们可以看到哪个主题在哪个页码上。

因此,当创建索引时,它们也存储在磁盘中,但是当应用程序运行时,基于频繁使用甚至更快的访问,它们被加载到RAM中,但加载和创建之间存在差异。

加载索引与将一个或多个记录加载到RAM中的方法不同。如果我们加载索引,我们知道从磁盘中获取所有文档的内容,不像加载所有文档并验证它们中的每一个。所以索引避免了收集扫描。

索引的创建是一次性过程,但是文档上的每次写入都可能会改变索引,因此某些部分可能需要重新计算,因为记录可能会根据数据的变化进行洗牌。这就是为什么索引使写入变慢和快速读取的原因。

再次将其视为一本书,如果您在本书之间添加说明2页的新主题,则需要重新计算该主题编号之后的所有索引。因此。

  

创建索引时使用(createIndex),Is Record始终存储在RAM中   ?

  • 不,记录不存储在RAM中,而创建它会对集合中的所有文档进行处理并创建索引表,如果文档太多,这将是非常费时的。为什么有一个选项可以在后台创建索引。
  

每当我的应用程序进入时,是否每次都需要创建索引   重启?

  • 索引创建一次,您可以删除它并再次创建,但它不会在应用程序或数据库重新启动时重新创建。对于在分片环境中进行大量收集而言,这将是疯狂的。
  

在默认ID(_id)的情况下会发生什么。总是存储在   RAM。

  • 再说不是这样。 _id作为索引字段,因此已经为空集合创建了索引,因为当您执行写操作时,它将重新计算索引。由于它是一个独特的索引,处理速度会更快。
  

_id是默认索引,这意味着所有记录始终存储在特定集合的RAM中吗?

  • 当您使用MongoDB的内存引擎时,所有记录都只会存储在RAM中,我认为它是企业版。由于索引,它不会自动将记录加载到RAM中。

答案 1 :(得分:0)

从标题回答问题: MongoDB 索引使用B 树数据结构

来源:https://docs.mongodb.com/manual/indexes/index.html#b-tree