1、简介

它就像是一本书的目录,如果没有它,我们就需要对整个书籍进行查找来获取需要的结果,即所说的全盘扫描;
而有了目录(索引)之后就可以通过它帮我们定位到目标所在的位置,快速的获取我们想要的结果。
2、演示
第一步,向用户集合users中插入100W条数据
var insertUsers = function() {
var start = new Date().getTime();
for (var i = 1; i <= 1000000; i++) {
db.users.insert({
"userid": i,
"username": "wjg" + i,
"age": Math.floor(Math.random() * 100), //年龄为0~99的随机整数
"createdate": new Date()
})
}
var end = new Date().getTime();
print("插入100W条数据共耗时" + (end - start) / 1000 + "秒");
}
LZ的渣渣I3和4G内存总共耗时了484.623秒,约8分多钟。任务管理器里边可以很清楚的看到当时CPU、内存和磁盘使用率都普遍的增高。
第二步:查询用户名为“wjg465413”的文档对象
db.users.find({username:"wjg465413"}).explain("allPlansExecution")
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.users",
"indexFilterSet" : false,
"parsedQuery" : {
"username" : {
"$eq" : "wjg465413"
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"username" : {
"$eq" : "wjg465413"
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 865,
"totalKeysExamined" : 0,
"totalDocsExamined" : 1000000,
"executionStages" : {
"stage" : "COLLSCAN",
"filter" : {
"username" : {
"$eq" : "wjg465413"
}
},
"nReturned" : 1,
"executionTimeMillisEstimate" : 770,
"works" : 1000002,
"advanced" : 1,
"needTime" : 1000000,
"needFetch" : 0,
"saveState" : 7813,
"restoreState" : 7813,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 1000000
},
"allPlansExecution" : [ ]
},
"serverInfo" : {
"host" : "Jack",
"port" : 27017,
"version" : "3.0.3",
"gitVersion" : "b40106b36eecd1b4407eb1ad1af6bc60593c6105"
},
"ok" : 1
}
说明:这里的explain方法相当于查询计划,它会返回给你查询过程的详细信息。它的参数有三种模式:“queryPlanner”(查询计划[默认])、“executionStats”(执行状态)和“allPlansExecution”(所有执行计划),这里我们只关注它返回给我们的以下几个信息。
"executionTimeMillis" : 865 //执行的毫秒数 注:如果你是第一次执行,可能会花费更长的时间 "totalDocsExamined" : 1000000 //共检查的文档数
第三步:在用户名“username”字段上加上索引
db.users.createIndex({ "username" : 1 })
重新执行上次的查询操作
db.users.find({username:"wjg465413"}).explain("allPlansExecution")
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.users",
"indexFilterSet" : false,
"parsedQuery" : {
"username" : {
"$eq" : "wjg465413"
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"username" : 1
},
"indexName" : "username_1",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"username" : [
"[\"wjg465413\", \"wjg465413\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 53,
"totalKeysExamined" : 1,
"totalDocsExamined" : 1,
"executionStages" : {
"stage" : "FETCH",
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 2,
"advanced" : 1,
"needTime" : 0,
"needFetch" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"docsExamined" : 1,
"alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 2,
"advanced" : 1,
"needTime" : 0,
"needFetch" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"keyPattern" : {
"username" : 1
},
"indexName" : "username_1",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"username" : [
"[\"wjg465413\", \"wjg465413\"]"
]
},
"keysExamined" : 1,
"dupsTested" : 0,
"dupsDropped" : 0,
"seenInvalidated" : 0,
"matchTested" : 0
}
},
"allPlansExecution" : [ ]
},
"serverInfo" : {
"host" : "Jack",
"port" : 27017,
"version" : "3.0.3",
"gitVersion" : "b40106b36eecd1b4407eb1ad1af6bc60593c6105"
},
"ok" : 1
}
可以看到两次的查询计划有很大的差别,我们还是着重看下那两个属性值。
"executionTimeMillis" : 53 //执行的毫秒数 "totalDocsExamined" : 1 //共检查的文档数
加过索引之后查询这个文档所耗费的时间仅仅为53毫秒,并且扫描一次直接定位,性能提升了16倍。可见合理使用索引的重要性!
注:“_id”字段是Mongo为我们默认添加的索引,而且是唯一索引,保证了数据的唯一性,不可以移除。另外,使用limit(1)限制查询结果的数量也可以提高查询速度
3、索引的类型
a)、单一索引:可以在数据集上任意一个字段上建立索引,包括普通的属性键、内嵌文档以及内嵌文档中的属性键。
db.users.createIndex({ "username" : 1 }) //普通属性键的索引
//假设class是一个内嵌的文档
db.users.createIndex({ "class" : 1 }) //内嵌文档的索引
db.users.createIndex({ "class.classname" : 1 }) //内嵌文档中的属性键索引
索引方向:1表示升序,-1表示降序
b)、复合索引:以多个属性键为基础而建立得索引
db.users.createIndex({ "username" : 1, "age" : -1, "userid" : 1 }) //在“username”、“age”和“userid”上建立复合索引
索引前缀:通过建立上边的复合索引之后,Mongo就相当于同时拥有了三个索引一样,分别是{"username" : 1},{"username" : 1, "age" : -1}和{"username" : 1, "age" : -1, "userid" : 1},但是像{"age" : -1},{"userid" : 1}或者{"age" : -1, "userid" : 1}这三个索引并不会起作用。所以它会使用包含了前缀(首个)的索引的作为复合索引
c)、多键索引:为数组中的多个值建立索引以实现高效查询。
注:Ⅰ、不允许在多个数组上建立复合索引
Ⅱ、不能指定片键作为多键索引
Ⅲ、哈希索引不能是多键
Ⅳ、多键索引不支持覆盖查询
d)、地理空间索引和查询:Mongo提供了两种曲面类型的索引:2dsphere索引和2d索引。查询类型包括:包含(inclusion),交叉(intersection)和接近(proximity)
e)、文本索引:用来支持查询包含了字符串或者字符串数组的文档
db.users.createIndex({"username" : "text"})
注:文本索引不支持排序并且一个复合文本索引不能再包含其他任何索引了
f)、哈希索引:它可以在使用了哈希片键进行分片的数据集上进行索引,支持相等查询,但是不支持范围查询
db.users.createIndex({"username" : "hashed"})
4、索引特性
a)、TTL(Time-To-Live)索引:是一种具有生命周期的索引,它允许为每一个文档设置一个超时时间
db.users.createIndex({ "createdate" : 1 },{ "expireAfterSecs" : 60*60*24 })
说明:在“createdate”字段上建立一个TTL索引,当这个自段存在并且是日期类型,当服务器时间比“createdate”字段的时间晚60*60*24秒,即24小时时,文档就会被删除
b)、唯一索引:确保集合的每一个文档的指定键都有唯一值
db.users.createIndex({"username" : 1}, {"unique" : true})
c)、稀疏索引:Mongo里边的null会被看做值,如果有一个可能存在也可能不存在的字段,我们可以使用稀疏索引
db.users.createIndex({"age" : 1},{"sparse" : true})
4、索引操作
a)、查看所有索引
db.users.getIndexes()
b)、移除索引
db.users.dropIndex({"createdate1" : 1 })
c)、移除所有索引
db.users.dropIndexes()
d)、重建索引
db.users.reIndex()
说明:该操作会先删除所有索引,包括“_id”,然后重新创建所有索引
# MongoDB索引
# MongoDB索引的用法介绍
# MongoDB索引类型汇总分享
# mongoDB数据库索引快速入门指南
# MongoDB通配符索引的用法实例
# 深入理解MongoDB的复合索引
# 关于MongoDB索引管理-索引的创建、查看、删除操作详解
# Mongodb索引的优化
# MongoDB索引使用详解
# MongoDB教程之索引介绍
# MongoDB数据库索引用法详解
# 文档
# 内嵌
# 多个
# 不支持
# 移除
# 它会
# 是一个
# 升序
# 几个
# 就会
# 都有
# 是一种
# 给你
# 你是
# 包含了
# 两种
# 不可以
# 两次
# 给我们
# 也可
相关文章:
广东企业建站网站优化与SEO营销核心策略指南
如何通过多用户协作模板快速搭建高效企业网站?
如何在阿里云虚拟服务器快速搭建网站?
建站主机无法访问?如何排查域名与服务器问题
建站之星免费模板:自助建站系统与智能响应式一键生成
高防服务器:AI智能防御DDoS攻击与数据安全保障
如何做静态网页,sublimetext3.0制作静态网页?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
建站之星2.7模板快速切换与批量管理功能操作指南
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何在阿里云部署织梦网站?
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
建站之星安装后如何配置SEO及设计样式?
如何用花生壳三步快速搭建专属网站?
Swift中swift中的switch 语句
黑客入侵网站服务器的常见手法有哪些?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
高防服务器租用首荐平台,企业级优惠套餐快速部署
详解jQuery中基本的动画方法
建站主机CVM配置优化、SEO策略与性能提升指南
如何通过商城自助建站源码实现零基础高效建站?
javascript中的try catch异常捕获机制用法分析
广东专业制作网站有哪些,广东省能源集团有限公司官网?
如何在云主机上快速搭建多站点网站?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
php json中文编码为null的解决办法
如何快速生成ASP一键建站模板并优化安全性?
如何访问已购建站主机并解决登录问题?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
如何快速搭建虚拟主机网站?新手必看指南
如何高效搭建专业期货交易平台网站?
如何在万网主机上快速搭建网站?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
如何快速查询网站的真实建站时间?
临沂网站制作公司有哪些,临沂第四中学官网?
长沙做网站要多少钱,长沙国安网络怎么样?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
太原网站制作公司有哪些,网约车营运证查询官网?
建站ABC备案流程中有哪些关键注意事项?
已有域名和空间如何搭建网站?
如何高效利用亚马逊云主机搭建企业网站?
网站制作服务平台,有什么网站可以发布本地服务信息?
网站图片在线制作软件,怎么在图片上做链接?
网站制作员失业,怎样查看自己网站的注册者?
建站之星各版本价格是多少?
*请认真填写需求信息,我们会在24小时内与您取得联系。