【MongoDB】(一)——关于MondoDB索引的总结

导读

为数据创建索引有助于提高查询数据的性能,本篇文章总结了创建MongoDB索引应遵循的规则。

我将这些规则分成四类

1.“query”
2.“sort”
3.“RAM”
4.“selectivity”

query

db.collection.find({})

  这一部分主要针对查询中的query部分,也就是find操作,说明我们如何创建索引,以及什么样的查询能够使该索引有效。
  
  【总的规则】:索引中包含find中的全部字段
  【具体规则】:
         1.如果所有查询都使用了同样的,唯一的字段,则创建只包含一个字段的索引。
        【举例】:db.collection.find({x:”}),那么索引就是{x:1}
         
         2.创建复合索引来支持包含多个字段的查询。复合索引支持查询中有全部索引字段或其子集(从开头算起的子集,类似于前缀一样的东西)的查询。         
        【举例】:如果索引是{x:1,y:1,Z:1},那么它支持find的查询条件为{x:”},{x:”,y:”}以及{x:”,y:”,z:”}

【注意】:这里的子集,有些不同于数学中的子集。这里的子集有个专业名称Index Prefix,索引前缀,所以暗含了是从前往后,是有顺序的。可以把索引看成一个单词,然后Index Prefix就是从前往后截取索引中的部分。

            【MongoDB】(一)——关于MondoDB索引的总结_第1张图片

sort

db.collection.find().sort({})

  这一部分主要针对查询中的sort部分,说明针对要排序的字段,我们应该如何创建索引,或者说如何排序才能使创建的索引有效。

【规则】:
     1.如果索引是唯一字段,查询中的sort也使用该字段,那么无论是升序还是降序,索引都有效。
     【举例】:如果索引是{x:1},sort({x:1})或({x:-1})都可以。
     
     2.如果索引是复合字段,那么sort中字段的排序方向(升序或降序)和要和索引完全一致,或每个字段都和索引相反。
     【举例】:如果索引是{x:1,y:-1},那么sort({x:1,y:-1})或者sort({x:-1,y:1})
     
     3.如果索引是复合字段,且查询中的sort部分的字段如果是是索引中的全部字段或子集(同上面的意思一致),那么find()中的字段满足上一部分我们说的query的第2条规则:复合索引支持查询中有全部索引字段或其子集(从开头算起的子集,类似于前缀一样的东西)的查询。
     
     4.如果索引是符合字段,但是查询中的sort部分的字段不是索引的全部字段或子集,这个时候find中的字段,必须是sort中字段在索引中其位置之前的字段。
     【举例】:索引是{x:1,y:1,z:1},如果sort({y:1}),那么find必须是索引中y之前的字段,包括y,即({x:1,y:1})

RAM

  index的大小需要小于RAM的大小,才能避免从磁盘中查询。
  计算index的大小:

db.collection.totalIndexSize()

  实际当中,应计算所有collection上index的大小,并使RAM大于index大小总和。
  

selectivity

  在创建索引时,要保证尽可能高的可选择性,不要创建了索引之后,仍需要扫描整个collection。
比如collection中有个字段是Status,该字段的值就‘A’(Active)或‘D’(Delete),这个时候如果索引是该字段的话,就会是很低的选择性,这个时候,可以结合另一个字段来创建索引,或者让Status的值分布更广泛些。

导图总结

【MongoDB】(一)——关于MondoDB索引的总结_第2张图片

你可能感兴趣的:(▶【数据库】,mongodb,索引)