Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 基于不同类型索引的Mongo中项目的物理顺序-?_Mongodb - Fatal编程技术网

Mongodb 基于不同类型索引的Mongo中项目的物理顺序-?

Mongodb 基于不同类型索引的Mongo中项目的物理顺序-?,mongodb,Mongodb,我读过一些关于MongoDb索引的文章,但对记录的物理布局并没有什么概念。我已经习惯于谈论关系数据库中的聚集索引(相当快的基于物理的)和非聚集索引。Mongo没有这样的术语,尽管他们的文档提到了二级索引。默认情况下,它似乎是按id主键创建索引,主键可能对应于存储上项目的物理顺序。请解释我:如果我为每个表创建一个索引,它会根据索引自动按物理顺序存储项吗?如果不是,我可以设置它吗?那么_id呢,默认情况下它符合物理顺序吗 MongoDB索引是B树索引。索引块在用于存储文档的相同数据文件中分配。目前(

我读过一些关于MongoDb索引的文章,但对记录的物理布局并没有什么概念。我已经习惯于谈论关系数据库中的聚集索引(相当快的基于物理的)和非聚集索引。Mongo没有这样的术语,尽管他们的文档提到了二级索引。默认情况下,它似乎是按id主键创建索引,主键可能对应于存储上项目的物理顺序。请解释我:如果我为每个表创建一个索引,它会根据索引自动按物理顺序存储项吗?如果不是,我可以设置它吗?那么_id呢,默认情况下它符合物理顺序吗

MongoDB索引是B树索引。索引块在用于存储文档的相同数据文件中分配。目前(从MongoDB版本2.2开始),除了标准B树索引之外,不支持任何其他索引类型

参考:

MongoDB不尝试对磁盘上的文档进行排序,也不尝试按任何特定顺序放置B树索引块。MongoDB使用内存映射文件访问磁盘上的数据结构。因此,哪些索引块在RAM中,哪些索引块被分页出来的问题被委托给OS内存管理系统

参考:

MongoDB文档在磁盘上始终是连续的。任何文档都只能位于一个物理位置:无需从多个磁盘位置组合文档

MongoDB最初按照文档的创建顺序在磁盘上分配文档。如果文档的大小超过了分配的大小(通过对该文档的更新,添加新字段、子文档或数组元素),则文档将被移动到磁盘上的新位置,该位置足够大,可以容纳新文档

删除文档将在分配的空间中创建“洞”:这些洞被放置在一个空闲列表中,新文档将被插入到这些洞中。因此,如果在MongoDB集合上重复执行remove()和insert()操作,文档将以高度无序的方式分散在磁盘上

特别是,文档将而不是以id顺序或任何其他索引的顺序排列在磁盘上

有关MongoDB存储管理的更多信息,请参阅以下演示: