稀疏索引(或者称间隙索引):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