MongoDB之稀疏索引

稀疏索引(或者称间隙索引):sparse index, 就是只包含有索引字段的文档的条目,跳过索引键不存在的文档

比如如下所示条目:

<span style="color:#000000"><span style="background-color:#ffffff"><code><span style="color:#e6c07b">test</span>:PRIMARY> db.scores.<span style="color:#61aeee">find</span>()
{ <span style="color:#98c379">"_id"</span> : ObjectId(<span style="color:#98c379">"523b6e32fb408eea0eec2647"</span>), <span style="color:#98c379">"userid"</span> : <span style="color:#98c379">"newbie"</span> }
{ <span style="color:#98c379">"_id"</span> : ObjectId(<span style="color:#98c379">"523b6e61fb408eea0eec2648"</span>), <span style="color:#98c379">"userid"</span> : <span style="color:#98c379">"abby"</span>, <span style="color:#98c379">"score"</span> : 82 }
{ <span style="color:#98c379">"_id"</span> : ObjectId(<span style="color:#98c379">"523b6e6ffb408eea0eec2649"</span>), <span style="color:#98c379">"userid"</span> : <span style="color:#98c379">"nina"</span>, <span style="color:#98c379">"score"</span> : 90 }
{ <span style="color:#98c379">"_id"</span> : ObjectId(<span style="color:#98c379">"61d6baa1167c9d56508b5c0d"</span>), <span style="color:#98c379">"userid_new"</span> : <span style="color:#98c379">"newbie"</span> }
{ <span style="color:#98c379">"_id"</span> : ObjectId(<span style="color:#98c379">"61d6baa1167c9d56508b5c0e"</span>), <span style="color:#98c379">"userid_new"</span> : <span style="color:#98c379">"abby"</span>, <span style="color:#98c379">"score_new"</span> : 82 }
{ <span style="color:#98c379">"_id"</span> : ObjectId(<span style="color:#98c379">"61d6baa1167c9d56508b5c0f"</span>), <span style="color:#98c379">"userid_new"</span> : <span style="color:#98c379">"nina"</span>, <span style="color:#98c379">"score_new"</span> : 90 }
</code></span></span>

我们给scores表的userid字段创建稀疏索引。

<span style="color:#000000"><span style="background-color:#ffffff"><code>db.scores.createIndex( { userid:1} , { sparse: <span style="color:#56b6c2">true</span> } )
</code></span></span>

指定sparse:true后,该索引的表现则为只包含前面三个含有userid字段的文档,后面三个不包含userid的文档则会被跳过。

稀疏索引和部分索引的区别

部分索引:Partial Indexes,仅对集合中满足指定筛选条件的文档进行索引。
部分索引是稀疏索引的复杂版本,它将根据指定条件筛选文档,不仅检查它们的存在。

例如上文中我们为score大于60的文档创建索引。

<span style="color:#000000"><span style="background-color:#ffffff"><code>db.scores.createIndex( 
  { score: 1}, 
  { partialFilterExpression: { score: { <span style="color:#d19a66">$gte</span>: 60 }}}
)
</code></span></span>

默认是稀疏索引的索引类型

  • 2dsphere (version 2)

  • 2d

  • geoHaystack

  • Text

稀疏索引失效的场景

如果稀疏索引会导致查询和排序操作的结果集不完整,MongoDB将不会使用该索引,除非hint()明确指定索引。

例如:

1.查询中指定{x: {$exists: false}}将不会在x字段上使用稀疏索引。

2.sort命令,指定sort( { userid: -1 } ),为了返回完整的结果, 即使查询通过索引字段来排序,MongoDB也不会选择稀疏索引来完成查询。

我们可以通过hint()来明确指定索引。

参考文档:https://docs.mongodb.com/manual/core/index-sparse/#std-label-sparse-index-incomplete-results

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值