4.MongoDB系列之索引(一)
1. 执行计划查看
db.getCollection('users').find({'username': 'shenjian'}).explain('executionStats')
结果查看,先大致看一遍,后续慢慢来深入理解
{
"queryPlanner": {
"plannerVersion": NumberInt("1"),
"namespace": "study.users",
"indexFilterSet": false,
"parsedQuery": {
"username": {
"$eq": "shenjian"
}
},
"winningPlan": {
"stage": "COLLSCAN",
"filter": {
"username": {
"$eq": "shenjian"
}
},
"direction": "forward"
},
"rejectedPlans": [ ]
},
"executionStats": {
"executionSuccess": true,
"nReturned": NumberInt("0"),
"executionTimeMillis": NumberInt("518"),
"totalKeysExamined": NumberInt("0"),
"totalDocsExamined": NumberInt("1000000"),
"executionStages": {
"stage": "COLLSCAN",
"filter": {
"username": {
"$eq": "shenjian"
}
},
"nReturned": NumberInt("0"),
"executionTimeMillisEstimate": NumberInt("0"),
"works": NumberInt("1000002"),
"advanced": NumberInt("0"),
"needTime": NumberInt("1000001"),
"needYield": NumberInt("0"),
"saveState": NumberInt("7812"),
"restoreState": NumberInt("7812"),
"isEOF": NumberInt("1"),
"direction": "forward",
"docsExamined": NumberInt("1000000")
}
},
"serverInfo": {
"host": "4a8812679047",
"port": NumberInt("27017"),
"version": "4.2.6",
"gitVersion": "20364840b8f1af16917e4c23c1b5f5efd8b352f8"
},
"ok": 1
}
2. 创建索引
db.getCollection('users').createIndex({'username': 1})
// 查看索引
db.getCollection('users').getIndexes({})
// 删除索引
db.getCollection('users').dropIndex({'username_1'})
如果集合特别大,则新开个窗口,执行命令db.currentOp(),重点关注ns为study.users的文档,搜索msg消息查看进度
"msg": "Index Build: inserting keys from external sorter into index Index Build: inserting keys from external sorter into index: 849146/1000000 84%",
"progress": {
"done": NumberInt("849150"),
"total": NumberInt("1000000")
}
3. 复合索引简介
db.getCollection('users').createIndex({'age': 1, 'username': 1})
对于多条件查询,复合查询用处很大,比如上面索引会严格按照age排序在按username排序,所以按照索引键对文档排序速度会快的多
4. MONGO如何选择索引
让多个查询计划相互竞争,只有查询最优的查询计划才会被选中,mongo会维护查询计划的缓存,这样后续查询就可以直接选择索引进行查询
5. 使用复合索引原则
- 等值过滤的键应该在最前面
- 用于排序的键应该在多值字段之前
- 多值过滤的键应该在最后面
这一块推荐看《MongoDB权威指南》索引章节,特别详细。如
db.getCollection('students').createIndex({'class_id': 1, 'final_grade': 1, 'student_id': 1})
索引对于查询就很高效
db.getCollection('students').find({'class_id': 54, 'student_id': {$gt: 50000}}).sort({'final_grade': 1}).explain('executionStats')
5.1 选择键的方向
基于多键排序时,方向才重要,如
db.getCollection('users').createIndex({'age': 1, 'username': -1})
5.2 使用覆盖索引
当索引中的字段包含用户请求的所有字段,呢么这个索引就覆盖了本次查询,就不会去获取实际的文档了,注意如果索引中不包含_id,则需要考虑_id不显示才能够覆盖索引查询,如
db.getCollection('users').find({'age': 110, 'username': 'user12'}, {'age': 1, 'username': 1, '_id': 0}).explain('executionStats')
{
"queryPlanner": {
"winningPlan": {
// 获胜的执行计划 覆盖索引
"stage": "PROJECTION_COVERED",
"transformBy": {
"age": 1,
"username": 1,
"_id": 0
},
"inputStage": {
"stage": "IXSCAN",
"keyPattern": {
"age": 1,
"username": 1
},
"indexName": "age_1_username_1"
}
}
},
"executionStats": {
"executionSuccess": true,
"nReturned": NumberInt("1"),
"executionTimeMillis": NumberInt("0"),
"totalKeysExamined": NumberInt("1"),
// 扫描的文档数为0
"totalDocsExamined": NumberInt("0")
}
}
5.3 隐式索引
复核索引具有双重功能,比如也具有索引{'class_id': 1}、{'class_id': 1,'final_grade': 1}的功能
db.getCollection('students').createIndex({'class_id': 1, 'final_grade': 1, 'student_id': 1})
但是对于{'class_id': 1, 'student_id': 1}不具有隐式索引,只有使用索引前缀的查询才会收益
4.MongoDB系列之索引(一)的更多相关文章
- MongoDB系列一(索引及C#如何操作MongoDB)
索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureIndex({"username": ...
- 5.MongoDB系列之索引(二)
1. $运算符如何使用索引 1.1 低效的运算符 $ne.$not查询可以使用索引,但不是很有效,尽量避免 1.2 范围查询 范围查询其实是多值查询,根据复核索引规则,尽可能先等值精确匹配,然后范围查 ...
- Node.js学习系列总索引
Node.js学习系列也积累了一些了,建个总索引方便相互交流学习,后面会持续更新^_^! 尽量写些和实战相关的,不讲太多大道理... Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- ...
- MongoDB系列(二):C#应用
前言 上一篇文章<MongoDB系列(一):简介及安装>已经介绍了MongoDB以及其在window环境下的安装,这篇文章主要讲讲如何用C#来与MongoDB进行通讯.再次强调一下,我使用 ...
- MongoDB学习笔记~索引提高查询效率
回到目录 索引这个东西大家不会陌生,只要接触到稍微大一点的数据,都会用到这东西,它可以提升查询的速度,相当代价就是占用了更多的存储空间,这也是正常的,符合“能量守恒定理”,哈哈!今天说的是MongoD ...
- MongoDB学习笔记(索引)
一.索引基础: MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令: > db.test.ensureIndex({" ...
- .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引
系列文章索引: .NET面试题解析(01)-值类型与引用类型 .NET面试题解析(02)-拆箱与装箱 .NET面试题解析(03)-string与字符操作 .NET面试题解析(04)-类型.方法与继承 ...
- MongoDB的学习--索引
索引可以用来优化查询,而且在某些特定类型的查询中,索引是必不可少的.为集合选择合适的索引是提高性能的关键. 先来mock数据 for (i = 0; i < 1000000; i++) { db ...
- 不可或缺 Windows Native 系列文章索引
[源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...
随机推荐
- 利用DockerHub在Centos7.7环境下部署Nginx反向代理Gunicorn+Flask独立架构
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_165 上一篇文章:Docker在手,天下我有,在Win10系统下利用Docker部署Gunicorn+Flask打造独立镜像,是在 ...
- WPF 截图控件之文字(七)「仿微信」
前言 接着上周写的截图控件继续更新添加 文字. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 4.WPF 截图控件之绘制方 ...
- Auto.js 特殊定位控件方法 不能在ui线程执行阻塞操作,请使用setTimeout代替
本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! Auto.js 特殊定位控件方法 操作环 ...
- 【springcloud】环境搭建与Rest使快速上手
SpringCloud环境搭建 --- Rest使用 个人主页:https://www.cnblogs.com/xbudian/ 今天来到SpringCloud的学习,我们从spring boot微服 ...
- Docker 06 部署Nginx
参考源 https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0 https://www.bilibili.com/vid ...
- mongo数据同步的三种方案
(一)直接复制data目录(需要停止源和目标的mongo服务)1.针对目标mongo服务已经存在,并正在运行的(mongo2-->mongo).执行步骤:(1).停止源/目标服务器的mongo服 ...
- 如何快速上手AIRIOT?
AIRIOT物联网低代码平台,快速构建稳定可靠的物联网系统,丰富的功能库及组件库,具备低成本.高效率.易操作,可扩展等特点,节省物联网项目实施时间及人力成本,支持二次开发. [六步快速上手,玩儿转 ...
- Windows权限维持总结
windows权限维持 注册服务 sc create 服务名 binpath= "cmd.exe /k 木马路径" start="auto" obj=" ...
- 第六十一篇:Vue的绑定事件和修饰符
好家伙,补基础加实践 1.绑定事件 我们使用v-on(简写为@)来绑定事件 写个例子, 按钮绑定数字加一(太tm经典了) 在<button>元素中使用@点击事件绑定方法"的&qu ...
- 第二十二篇:有关插槽solt的使用
1.什么是插槽? 插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示, 父组件可以在这个占位符中填充任何模板代码,如 HTML.组件等,填充的内 ...