hx0011yy 发表于 2018-10-25 09:25:49

MongoDB 使用Index

  Index 能够提高查询的性能,如果没有Index,MongoDB必须扫描整个collection,从collection的第一个doc开始,直到最后一个doc,即使第一个doc之后的所有doc都不满足查询条件。如果在Collection上有合适的Index,例如,unique index,那么MongoDB在按照index key查找到一个doc之后,就不会继续对其他doc查询,极大地提高查询性能。
  MongoDB的 Index 结构跟关系型DB的NonClustered Index相似,都是BTree结构,在每个leaf node中,除了index key之外,还存储相应doc在disk上的地址。在MongoDB中,没有clustered index,因此,Collection初始的物理存储跟doc插入的顺序有关,MongoDB按照doc插入的顺序,依次将doc存储在disk上,插入顺序上相邻的doc在disk的物理位置上也是相邻的;对doc的修改可能对 collection 的物理存储发生变化,如果doc的修改不会导致doc的size增加,那么doc会继续存储在原来的存储空间中,而不会对collection的物理存储有影响,一旦修改操作导致doc的size增加,导致doc发生移动,那么collection的物理存储就会发生变化。
  一,doc的移动影响collection的物理存储
  如果数据修改增加了doc的size,使其不能继续存放在原来的存储空间中,那么MongoDB必须将其移动到collection的末尾,原先的存储空间被闲置,导致doc的存储密度下降,会严重影响查询性能。doc的移动过程是非常慢的,相当于在一个原子操作中,先做doc的 delete 操作,后做doc的 insert 操作。
  doc移动的过程如下图所示:
  对doc B进行修改,使其Size增大,原先的位置不能容纳B,MongoDB将B移动在Collection的末尾。原来的存储空间被闲置。
http://images2015.cnblogs.com/blog/628084/201608/628084-20160829171727480-271166791.jpg
  二,创建index
  MongoDB的index是BTree 结构,BTee结构的特点是:查询每个值所要进行查询的次数时固定的,最小的值存储在最左边的叶子节点上,做大的值存储在最右边的叶子节点上,如图:
http://images2015.cnblogs.com/blog/628084/201608/628084-20160830110101558-1523060537.jpg
  MongoDB默认按照“_id”字段的升序创建index,最后创建的doc位于index的右侧。如果每次查询时,都是查询最后的N个doc,那么按照"_id"的值倒叙查询,limit 前100,查询性能是十分快速的。也可以手动创建符合业务需要的Index,MongoDB使用 db.collection.createIndex(keys,option)函数创建index。
  keys的格式是:{field:1/-1,,},field是doc的字段,1/-1 表示按照field排序的方向创建index:1表示按照field的升序创建,-1表示按照field的降序创建。
db.collection.createIndex(keys,option)  1,创建示例数据,按照 age 字段升序创建index
  创建的Index按照age的升序存储age字段,在叶子节点中,除了age字段,叶子节点还会存储doc的地址(指针),用于定位相应的doc,查询除index key(age)之外的其他字段。下面的语句创建的index name是 age_1。
http://common.cnblogs.com/images/copycode.gif
for(i=0;i
页: [1]
查看完整版本: MongoDB 使用Index