MongoDb 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度
一、索引基础
索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得 更快。
MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧。
下面是创建索引的命令:
db.user.ensureIndex({"userame":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 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度相关推荐
- oracle 强制索引_当唯一索引遇见分布式数据库
这是Tank的第18篇文章 1 关于分片键 分布式数据库通过将表的数据打散,按一定规则将数据分布在多个独立的主机上,常见的策略如HASH.RANGE.LIST等分布方式.不考虑中间件的解决方案,在原生 ...
- 《Python金融大数据风控建模实战》 第6章 变量分箱方法
<Python金融大数据风控建模实战> 第6章 变量分箱方法 本章引言 Python代码实现及注释 本章引言 变量分箱是一种特征工程方法,意在增强变量的可解释性与预测能力.变量分箱方法主要 ...
- MySQL普通索引与唯一索引__mysql中唯一索引和普通索引的用途及区别
MySQL普通索引与唯一索引 索引作用: 提高查询效率,一般加在经常查询或者排序的字段上. 普通索引: 允许字段值重复 唯一索引: 保证数据记录唯一性 如何选择: 查询过程: 对普通索引来说,找到满足 ...
- GBase8s 唯一索引与非唯一索引
唯一索引在列中不允许重复的值出现,可以用来定义和约束表中的一列或者多列组合值,在执行insert和update语句时需要检查唯一性.GBase8s中主键(PRIMARY KEY)会自动创建一个唯一索引 ...
- 大数据时代MongoDB、ES、Redis、HBase这四种数据库你应该懂
数据库对互联网开发的重要性就不必多说了.作为大数据和AI时代的互联网er,如果你还是只懂MySQL,那你可就火星大发了.下面给大家总结下每个互联网er都必须懂的几种数据库产品. MongoDB Mon ...
- mongoDB大数据查询坑
有一个30亿量级数据的库,如何全量爬取并分析? 因为量级过大无法一次性爬取至本地再分析,考虑使用limit().skip()混合的方法,一次读取1万条数据进行分析存储,30亿数据分成30万份后再合并分 ...
- spark+mongodb大数据框架搭建
spark依赖环境 1. jdk 1.8 2. scala 2.11 3. hadoop 2.7(本文用mongodb取代Hadoop HDFS,不需要安装) 安装JDK 略.. 安装Scala Sc ...
- spring data mongodb 大数据量查询性能差的原因(20s 优化到2s)
结论 通过反复查询原因,最终确定,数据库查询速度很快,最重要的是mongodb将查询出来的数据映射到实体属性中,这个过程太过耗费时间 优化1 通过使用temple来查询的语句 // 这个查询出来所有符 ...
- qq空间代码查询_Mysql千万级大数据查询优化经验,一点课堂(多岸学院)
提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意) 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避 ...
最新文章
- [日期工具分享][Shell]为特定命令依次传入顺序日期执行
- 高等数学:第六章 定积分的应用(1)定积分的应用 平面图形的面积 立体体积
- 数学理论—— 蒙特卡洛近似
- uwsgi部署到nginx出现invalid request block size: 4161 (max 4096)...skip问题(亲测)
- 模型压缩:模型量化打怪升级之路-工具篇
- 设计模式--责任链模式--Java实现
- 算法高级(4)-遗传算法(Genetic Algorithm)简介
- Caused by: java.lang.ClassNotFoundException: org.springframework.orm.hibernate4.HibernateTemplate
- MySQL的select语法
- 基于mfc 组态软件_组态软件有哪些?InTouch、WinCC、组态王?
- Win10 分页缓冲池 过大
- 股票指数的四种加权方式
- Rest Stops
- Python:将Word转成HTML
- VAO 与 VBO 的前世今生
- Communication error with Jack server
- IDL的参数传递(五)
- 转大型分布式网站术语浅析
- java中除法和取余的若干注意
- PADS 9.5 acs文件导入失败
热门文章
- 清华大学《操作系统》(十二):临界区与锁
- php多文件上传存储到表,PHP 实现一种多文件上传的方法
- python 类变量(属性)和实例变量(属性
- DataReceivedEventHandler 委托 接收调用执行进程返回数据
- 在线mod计算机,MOD大师教程 手把手教你改造电脑机箱
- oracle闪回某个时间点的数据库,oracle11g 使用闪回查询恢复表到过去某一个时间点...
- vue php 文件上传,使用vue.js和laravel上传文件
- LeetCode27——Remove Element(移除数组中指定的元素)
- 关注 Imagine Cup 2010, 参与软件设计“最具人气奖”投票
- VS Code设置中文插件