我读过几篇关于在 MongoDb 中建立索引的文章,但对记录的物理布局一无所知。我习惯于谈论关系数据库中的聚集索引(基于物理的相当快的索引)和非聚集索引。Mongo 没有这样的术语,尽管他们的文档提到了二级索引。默认情况下,它似乎通过 _id 主键创建索引,这可能对应于存储中项目的物理顺序。请解释一下:如果我为每个表创建一个索引,它会根据索引自动按物理顺序存储项目吗?如果不是,我可以以某种方式设置它吗?_id呢,默认对应物理顺序吗?
1 回答
MongoDB 索引是 B 树索引。索引块分配在用于存储文档的相同数据文件中。目前(从 MongoDB 版本 2.2 开始)不支持标准 B 树索引之外的任何其他索引类型。
参考:http ://docs.mongodb.org/manual/core/indexes/
MongoDB 不会尝试对磁盘上的文档进行排序,也不会以任何特定的顺序放置 B-Tree 索引块。MongoDB 使用内存映射文件来访问磁盘上的数据结构。因此,哪些索引块在 RAM 中以及哪些索引块被调出的问题被委托给 OS 内存管理系统。
参考:http ://docs.mongodb.org/manual/faq/storage/
MongoDB 文档在磁盘上总是连续的。任何文档都只会位于一个物理位置:从不需要从多个磁盘位置组合文档。
MongoDB 最初按照文档的创建顺序在磁盘上分配文档。如果一个文档的大小超过了分配的大小(通过对该文档的更新添加新的字段、子文档或数组元素),那么该文档将被移动到磁盘上的一个新位置,该位置足以容纳新文档。
删除文档将在分配的空间中创建“空洞”:这些空洞被放置在空闲列表中,新文档被插入到这些空洞中。因此,如果您对 MongoDB 集合执行重复的 remove() 和 insert() 操作,文档将以高度无序的方式分散在磁盘上。
特别是,文档不会按 _id 顺序或任何其他索引的顺序排列在磁盘上。
有关 MongoDB 存储管理的更多信息,请查看以下演示文稿: