MongoDb多键索引 - 稀疏,独特和增长问题

时间:2016-02-26 23:03:38

标签: mongodb indexing

对于first pattern example of Mongodb Model One-to-Many Relationships with Document References -

我对发布商book的{​​{1}}数组字段创建多键索引有一些疑问:

出于学习目的,我将在未来假装图书数组仅增加最多 5个元素,因此我想仅关注此模式使用数组:

  1. 当我将一个objectId添加到book数组时,它会自动索引新元素吗?

  2. 当我创建O'Reilly Media时,我想制作吗? 背景为true,因此当我添加到书籍时它不会阻止 在后来的数组中,它会为新值编制索引吗?

  3. 默认情况下,我看到db.publishers.createIndex(books)值为false。我很困惑 这是因为我不知道MongoDb索引的内部工作原理。 unique数组上的唯一值不一定是真的吗?
  4. 对于books,我为什么要使用它,为什么设置为false?该 sparse数组已经是指定字段。
  5. 如果我删除了数组的元素,那么索引的大小 自动减少?
  6. 我假设如果我稍后修改书籍文件就不会生效 写入性能,因为它的objectId之前已被索引 出版商书籍数组,对吗?

    books

1 个答案:

答案 0 :(得分:1)

  1. MongoDB会自动将书籍ID添加到多键索引中。但是,该索引当然不包括实际的书籍文档。
  2. 块仅在创建索引时发生,而不是在添加项目时发生(尽管将新项目放入索引的开销非常小)。想象一下,你已经拥有10k个出版物,每个有20万册书籍 - 索引那些只需要一段时间,阻止任何操作,因此更快,我们在后台做。
  3. null值也是唯一值。因此,如果没有出版图书,您就不可能有两个出版商。
  4. 稀疏指数用于节省宝贵的RAM。如果您有数百万个文档,其中只有一小部分具有某个字段,那么只有几百万null条目就会浪费RAM。如今,部分索引是首选,它提供与稀疏诱导相同的功能,然后是一些。
  5. 是,按您删除的值。如果数组被删除清空并且您使用了稀疏或部分索引,则对文档的相应引用也将被删除。
  6. 完全错了。索引 - 大大简化 - 除了索引字段的寄存器和数据文件中相应文档的位置之外别无其他。对于books数组,这将是包含索引值的发布者文档。同样,它不是被索引的书籍文件,而是包含对书籍文件的引用的字段。书籍字段被编入索引的原因是,对于给定的书籍,可以更快地找到出版商:

    db.publishers.find({books:someBookId})
    

    编辑图书文档时,您首先必须找到它并应用最终需要同步到磁盘的更改(甚至是之前的日志)。索引不会神奇地消除持久化数据的需要。