我读过几篇关于MongoDb索引的文章,但是对于记录的物理布局并不了解。我习惯于谈论关系数据库中的集群(非常快速的物理)和非集群索引。 Mongo没有这样的术语,尽管他们的文档提到了二级索引。默认情况下,它似乎通过_id主键创建索引,可能对应于存储上项目的物理顺序。请解释一下:如果我为每个表创建一个索引,它会根据索引自动将项目存储在物理顺序中吗?如果不是,我可以以某种方式设置它吗?怎么样_id,它默认对应物理顺序?
答案 0 :(得分:3)
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()操作,文档将以高度无序的方式分散在磁盘上。
特别是,文档将 NOT 按_id顺序排列在磁盘上,或按任何其他索引的顺序排列。
有关MongoDB存储管理的更多信息,请查看以下演示文稿: