参考文档:
稀疏索引
稀疏索引只包含具有索引字段的文档(包含索引字段是空值的文档),它将跳过任何没有索引字段的文档。索引是“稀疏的”。非稀疏索引包含集合中的所有文档,为那些不包含索引字段的文档存储空值。
假设你有包含如下文档的集合:
{ _id: 1, firstname: 'John', lastname: 'Black', age: 20 }
{ _id: 2, firstname: 'Stive', lastname: 'White', age: 17 }
{ _id: 3, firstname: 'Tom', age: 22 }
如果你为lastname字段创建索引,语句为:
db.users.createIndex({ lastname: 1 });
它将为3个文档上创建索引,但是我们其实不需要在_id:3的文档上创建索引。为了避免这种为空字段创建索引的情况,mongodb引入了稀疏索引。通过指定sparse:true。
db.users.createIndex({ lastname: 1, sparse: true });
此时MongoDB将只会为两个文档(_id:1,_id:2)添加索引。
我们看到稀疏索引只是简单的检查非空字段,假设我们想为age大于18的文档创建索引,我们就不能通过稀疏索引来解决了,这就引入了部分索引。
部分索引
部分索引仅对集合中满足指定筛选条件的文档进行索引,通过索引集合中文档的子集,部分索引的存储需求更低,索引创建和维护的性能成本也更低。
例如上文中我们为age大于18的文档创建索引。
db.person.createIndex(
{ age: 1},
{ partialFilterExpression: { age: { $gte: 18 }}
);
这个例子将只为一个文档(_id:1)设置索引。
部分索引是稀疏索引的复杂版本,它将过滤文档,不仅检查它们的存在。