MongoDB覆盖索引查询
2年前 (2024-04-27)
你可能听说过列索引是通过限度地减少查询所需的磁盘访问次数来优化查询性能的好方法。MongoDB 有一个字段索引的特定应用程序,称为覆盖索引查询(Covered Queries),其中查询的所有列都被进行索引。因为 MongoDB 不必检查除索引之外的任何文档,所以覆盖索引查询非常快。本节我们就来学习一下如何使用覆盖索引查询更快地查询数据。
因为查询中的所有字段都是索引的一部分,所以 MongoDB 匹配查询条件并使用相同的索引返回结果,而不实际查看文档内部。由于索引存在于 RAM 中,从索引中获取数据比通过扫描文档获取数据快得多。
因为我们的索引中不包含 _id 字段,所以我们已经从查询的结果集中排除了它,因为 MongoDB 在默认情况下会在每个查询中返回 _id 字段,所以下面的查询不会包含在上面创建的索引中:
什么是覆盖索引查询?
根据 MongoDB 官方文档,覆盖查询是一下查询:查询中的所有字段都是索引的一部分;
查询中返回的所有字段都在同一索引中。
因为查询中的所有字段都是索引的一部分,所以 MongoDB 匹配查询条件并使用相同的索引返回结果,而不实际查看文档内部。由于索引存在于 RAM 中,从索引中获取数据比通过扫描文档获取数据快得多。
使用覆盖索引查询
假设在“users”中有以下文档:首先我们需要在“users”中的 gender 和 name 字段上创建一个复索引,如下所示:{
"_id" : ObjectId("603de64bd0fbb11d21e780dc"),
"phone" : "",
"birth" : "01-01-1991",
"name" : "bianchengbang",
"gender" : "M"
}
现在,这个索引将包含以下查询:> db.users.createIndex({gender:1, name:1})
{
"createdCollectionAutomatically" : false,
"numIndexeefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
也就是说,对于上面的查询,MongoDB 不会查看数据库文档。相反,它将从索引数据中获取所需的数据,这样的查询速度是非常快的。> db.users.find({gender:"M"},{name:1,_id:0})
{ "name" : "bianchengbang" }
因为我们的索引中不包含 _id 字段,所以我们已经从查询的结果集中排除了它,因为 MongoDB 在默认情况下会在每个查询中返回 _id 字段,所以下面的查询不会包含在上面创建的索引中:
另外,如果是以下的查询,也不能使用覆盖索引查询:> db.users.find({gender:"M"}, {name:1})
{ "_id" : ObjectId("603de64bd0fbb11d21e780dc"), "name" : "bianchengbang" }
所有索引字段是一个数组;
所有索引字段是一个子文档。
- 随机文章
- 核心危机(核心危机魔石合成攻略)
- 风儿(风儿轻轻的吹)
- 饿了么红包怎么用(饿了么红包怎么用微信支付)
- 儿童教育文章(儿童教育)
- 光遇花手先祖位置(安卓光遇手花先祖)
- 广州4a广告公司(广州4a广告公司创意总监年薪)
- xboxones(xboxone手柄怎么配对主机)
- 兵马俑(兵马俑介绍和历史背景)
- 陈武简历
- 海猫鸣泣之时游戏(海猫鸣泣之时游戏在哪玩)
- 儋州市第二中学(儋州市第二中学录取分数线)
- 鬼泣5攻略(鬼泣5攻略第三关怎么跳)
- yy魔兽(yy魔兽世界)
- 国外成人游戏(国外成人游戏注册需要visa信用卡)
- 充值卡代理(充值卡代理加盟)
- 拆奶罩
- 郭妮小说(恶魔的法则郭妮小说)
- 杭同(杭同培训中心怎么样)
- 大松电饭煲(美的大松电饭煲)
- 服饰加盟(服饰加盟店招商)
- 点对点短信息(点对点短信息费是什么意思)
- 观音普门品(观音普门品念诵全文)
- 河北省大运会(河北省大运会时间)
- 骇客神条(骇客神条怎么辨别真假)
- 杜星霖(杜星霖图片)
- 查传倜(查传倜个人生活)
- 钢筋等级符号(钢筋等级符号电脑怎么输入)
- 常州天宁寺(常州天宁寺求什么灵验)
- 河源巴伐利亚(河源巴伐利亚庄园)
- 广州中山大学(广州中山大学录取分数线2023)
