什么是覆盖索引查询?
根据 MongoDB 官方文档,覆盖查询是一下查询:- 查询中的所有字段都是索引的一部分;
- 查询中返回的所有字段都在同一索引中。
因为查询中的所有字段都是索引的一部分,所以 MongoDB 匹配查询条件并使用相同的索引返回结果,而不实际查看文档内部。由于索引存在于 RAM 中,从索引中获取数据比通过扫描文档获取数据快得多。
使用覆盖索引查询
假设在“users”集合中有以下文档:
{
"_id" : ObjectId("603de64bd0fbb11d21e780dc"),
"phone" : "15011226666",
"birth" : "01-01-1991",
"name" : "bianchengbang",
"gender" : "M"
}
首先我们需要在“users”集合中的 gender 和 name 字段上创建一个复合索引,如下所示:
> db.users.createIndex({gender:1, name:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
现在,这个索引将包含以下查询:
> db.users.find({gender:"M"},{name:1,_id:0})
{ "name" : "bianchengbang" }
也就是说,对于上面的查询,MongoDB 不会查看数据库文档。相反,它将从索引数据中获取所需的数据,这样的查询速度是非常快的。因为我们的索引中不包含 _id 字段,所以我们已经从查询的结果集中排除了它,因为 MongoDB 在默认情况下会在每个查询中返回 _id 字段,所以下面的查询不会包含在上面创建的索引中:
> db.users.find({gender:"M"}, {name:1})
{ "_id" : ObjectId("603de64bd0fbb11d21e780dc"), "name" : "bianchengbang" }
另外,如果是以下的查询,也不能使用覆盖索引查询:- 所有索引字段是一个数组;
- 所有索引字段是一个子文档。