MongoDB 覆盖索引查询

MongoDB 覆盖索引查询

官方的MongoDB的文档中对覆盖查询做了说明:

  • 所有的查询字段是索引的一部分
  • 所有的查询返回字段在同一个索引中

由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询结果。因为索引存在于RAM中,从索引中获取数据比通过扫描文档读取数据要快得多。


使用覆盖索引查询

test集合:

/* 1 */
{
    "_id" : ObjectId("63e36e36da0f660d6928a751"),
    "id" : 200.0,
    "name" : "zhang",
    "age" : 32.0
}

/* 2 */
{
    "_id" : ObjectId("63e36e36da0f660d6928a752"),
    "id" : 22.0,
    "name" : "wang",
    "age" : 18.0
}

/* 3 */
{
    "_id" : ObjectId("63e36ea0da0f660d6928a753"),
    "id" : 300.0,
    "name" : "zeng",
    "age" : 28.0
}

/* 4 */
{
    "_id" : ObjectId("63e37016da0f660d6928a754"),
    "id" : 888.0,
    "name" : "zeng",
    "age" : 20.0
}

我们在 test集合中创建联合索引,字段为 name和 age:

db.test.createIndex({name:1,age:1})

注:5.0 之前版本可以使用 db.collection.ensureIndex() ,但 ensureIndex() 在 5.0 版本后已被移除,使用 createIndex() 代替。

现在,该索引会覆盖以下查询:

db.test.find({name:"zeng"},{age:1,_id:0})

 

对于上述查询,MongoDB的不会去数据库文件中查找。它会从索引中提取数据,这是非常快速的数据查询。由于我们的索引中不包括 _id 字段,_id在查询中会默认返回,需要在MongoDB的查询结果集中排除它。

下面的实例没有排除_id,查询就不会被覆盖:

db.test.find({name:"zeng"},{age:1})

 

最后,如果是以下的查询,不能使用覆盖索引查询:

  • 所有索引字段是一个数组
  • 所有索引字段是一个子文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小石头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值