MongoDB 索引 explain 分析查询速度
一、索引基础
索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得
更快。MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查
询优化技巧。
下面是创建索引的命令:
db.user.ensureIndex({"username":1})
获取当前集合的索引:
db.user.getIndexes()
删除索引的命令是:
db.user.dropIndex({"username":1})
在 MongoDB 中,我们同样可以创建复合索引,如:
数字 1 表示 username 键的索引按升序存储,-1 表示 age 键的索引按照降序方式存储。
db.user.ensureIndex({"username":1, "age":-1})
该索引被创建后,基于 username 和 age 的查询将会用到该索引,或者是基于 username
的查询也会用到该索引,但是只是基于 age 的查询将不会用到该复合索引。因此可以说,
如果想用到复合索引,必须在查询条件中包含复合索引中的前 N 个索引列。然而如果查询
条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB 可以智能的帮助我们调
整该顺序,以便使复合索引可以为查询所用。如:
db.user.find({"age": 30, "username": "stephen"})
对于上面示例中的查询条件,MongoDB 在检索之前将会动态的调整查询条件文档的顺
序,以使该查询可以用到刚刚创建的复合索引。
对于上面创建的索引,MongoDB 都会根据索引的 keyname 和索引方向为新创建的索引
自动分配一个索引名,下面的命令可以在创建索引时为其指定索引名,如:
db.user.ensureIndex({"username":1},{"name":"userindex"})
随着集合的增长,需要针对查询中大量的排序做索引。如果没有对索引的键调用 sort,
MongoDB 需要将所有数据提取到内存并排序。因此在做无索引排序时,如果数据量过大以
致无法在内存中进行排序,此时 MongoDB 将会报错。
二、唯一索引
在缺省情况下创建的索引均不是唯一索引。下面的示例将创建唯一索引,如:
db.user.ensureIndex({"userid":1},{"unique":true})
如果再次插入 userid 重复的文档时,MongoDB 将报错,以提示插入重复键,如:
db.user.insert({"userid":5})
db.user.insert({"userid":5})
E11000 duplicate key error index: user.user.$userid_1 dup key: { : 5.0 }
如果插入的文档中不包含 userid 键,那么该文档中该键的值为 null,如果多次插入类似
的文档,MongoDB 将会报出同样的错误,如:
db.user.insert({"userid1":5})
db.user.insert({"userid1":5})
E11000 duplicate key error index: user.user.$userid_1 dup key: { : null }
如果在创建唯一索引时已经存在了重复项,我们可以通过下面的命令帮助我们在创建唯
一索引时消除重复文档,仅保留发现的第一个文档,如:
先删除刚刚创建的唯一索引。
db.user.dropIndex({"userid":1})
插入测试数据,以保证集合中有重复键存在。
db.user.remove()
db.user.insert({"userid":5})
db.user.insert({"userid":5})
重新创建唯一索引
db.user.ensureIndex({"userid":1},{"unique":true })
我们同样可以创建复合唯一索引,即保证复合键值唯一即可。如:
db.user.ensureIndex({"userid":1,"age":1},{"unique":true})
三、索引的一些参数
如果在为已有数据的文档创建索引时,可以执行下面的命令,以使 MongoDB 在后台创
建索引,这样的创建时就不会阻塞其他操作。但是相比而言,以阻塞方式创建索引,会使整
个创建过程效率更高,但是在创建时 MongoDB 将无法接收其他的操作。
db.user.ensureIndex({"username":1},{"background":true})
四、使用 explain
explain 是非常有用的工具,会帮助你获得查询方面诸多有用的信息。只要对游标调用
该方法,就可以得到查询细节。explain 会返回一个文档,而不是游标本身。如:
explain 会返回查询使用的索引情况,耗时和扫描文档数的统计信息。
五、explain executionStats 查询具体的执行
时间
db.tablename.find().explain( "executionStats" )
关注输出的如下数值:explain.executionStats.executionTimeMillis
MongoDB 索引 explain 分析查询速度的更多相关文章
- MongoDB学习day03--索引和explain分析查询速度
一.索引基础 db.user.ensureIndex({"username":1}) 创建索引,username为key,数字 1 表示 username 键的索引按升序存储, - ...
- explain分析查询
参考以下文章,在此非常感谢原作者 explain分析查询
- MySQL 千万 级数据量根据(索引)优化 查询 速度
一.索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经让 ...
- mysql索引原理及查询速度优化
一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...
- MYSQL学习笔记 (六)explain分析查询
使用EXPLAIN可以模拟优化器执行SQL语句,从而知道MYSQL是如何处理你的SQL,从而分析查询语句或者表结构的瓶颈.
- MySql 使用explain分析查询
今天写了个慢到哭的查询,想用explain分析下执行计划,后来发现explain也是有局限性的: EXPLAIN不会告诉你关于触发器.存储过程的信息或用户自定义函数对查询的影响情况 •EXPLAIN不 ...
- Explain分析查询语句
表的读取顺序 读取操作的类型 可用索引,实际使用的索引 表之间的引用 每张表多少行被优化器查询 索引的长度 EXPLAIN字段解释: ØTable:显示这一行的数据是关于哪张表的 Øpossible ...
- MongoDB 索引 .explain("executionStats")
MongoDB干货系列2-MongoDB执行计划分析详解(3) http://www.mongoing.com/eshu_explain3 MongoDB之使用explain和hint性能分析和优化 ...
- BLOB或TEXT字段使用散列值和前缀索引优化提高查询速度
1.创建表,存储引擎为myisam,对大文本字段blob使用MD5函数建立一个散列值 create table t2(id varchar(60), content blob, hash_value ...
随机推荐
- linux 常用压缩解压命令
压缩格式 打包/解压 执行命令 .tar 解包 tar ...
- 使用charles模拟慢速网络
1.设置慢速网络 点击导航栏的proxy---throttle setting来设置想要的网络情况, 其中有两种方法: (1)勾选Enable Throttling,在Throttle presett ...
- Asp.net Web Api开发(第四篇)Help Page配置和扩展
https://blog.csdn.net/sqqyq/article/details/52708613
- 小程序:scroll-view组件滑动多次触发scroll事件的bug解决
在项目开发过程中,组件是微信小程序提供给我们的一个分页器,一般滑动到底部时会触发scroll事件,scroll事件中往往包含对后端数据的请求:若是还未滑动到底部时频繁触发事件,则会频繁发请求,达不到想 ...
- andorid开发build.gradle 增加几种产品的方法
因为需要有些ndk的开发,cmakelists里需要定义不同的变量,这个在网上搜索解决方案,不是很容易就直接找到答案. 尝试了不少,最后找到解决方案.升级Gradle3.0,这个文章价值高. 在ras ...
- Cocos Creater 监听程序到后台和重新到前台
cocos creator前后台切换当玩家在玩游戏时,突然接了一个电话,此时游戏会被切到后台待机,所有的声音播放都会停止,等打完电话,回到游戏,游戏又会被切回前台来,需要手动播放声音.可使用如下代码 ...
- TextField widgets require a Material widget ancestor
TextField widget需要被包裹在Scaffold widget中,否则会报错
- linux ping: unknown host www.baidu.com
在虚拟机中使用CentOS6.5时,ping www.baidu.com出现报错信息:“ping: unknown hostwww.baidu.com”,虚拟机和物理机网络连接是NAT方式,物理机访问 ...
- SQL Server创建存储过程——动态SQL
简介: 存储过程(stored procedure)是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行. 自定义存储过程,由用户创建并能完成 ...
- md5加密utils
package cn.itcast.bos.utils; import java.math.BigInteger; import java.security.MessageDigest; impo ...