导读
为数据创建索引有助于提高查询数据的性能,本篇文章总结了创建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就是从前往后截取索引中的部分。
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的值分布更广泛些。
导图总结
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)