一、索引基础

索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得 更快。
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 分 析查询速度相关推荐

  1. oracle 强制索引_当唯一索引遇见分布式数据库

    这是Tank的第18篇文章 1 关于分片键 分布式数据库通过将表的数据打散,按一定规则将数据分布在多个独立的主机上,常见的策略如HASH.RANGE.LIST等分布方式.不考虑中间件的解决方案,在原生 ...

  2. 《Python金融大数据风控建模实战》 第6章 变量分箱方法

    <Python金融大数据风控建模实战> 第6章 变量分箱方法 本章引言 Python代码实现及注释 本章引言 变量分箱是一种特征工程方法,意在增强变量的可解释性与预测能力.变量分箱方法主要 ...

  3. MySQL普通索引与唯一索引__mysql中唯一索引和普通索引的用途及区别

    MySQL普通索引与唯一索引 索引作用: 提高查询效率,一般加在经常查询或者排序的字段上. 普通索引: 允许字段值重复 唯一索引: 保证数据记录唯一性 如何选择: 查询过程: 对普通索引来说,找到满足 ...

  4. GBase8s 唯一索引与非唯一索引

    唯一索引在列中不允许重复的值出现,可以用来定义和约束表中的一列或者多列组合值,在执行insert和update语句时需要检查唯一性.GBase8s中主键(PRIMARY KEY)会自动创建一个唯一索引 ...

  5. 大数据时代MongoDB、ES、Redis、HBase这四种数据库你应该懂

    数据库对互联网开发的重要性就不必多说了.作为大数据和AI时代的互联网er,如果你还是只懂MySQL,那你可就火星大发了.下面给大家总结下每个互联网er都必须懂的几种数据库产品. MongoDB Mon ...

  6. mongoDB大数据查询坑

    有一个30亿量级数据的库,如何全量爬取并分析? 因为量级过大无法一次性爬取至本地再分析,考虑使用limit().skip()混合的方法,一次读取1万条数据进行分析存储,30亿数据分成30万份后再合并分 ...

  7. spark+mongodb大数据框架搭建

    spark依赖环境 1. jdk 1.8 2. scala 2.11 3. hadoop 2.7(本文用mongodb取代Hadoop HDFS,不需要安装) 安装JDK 略.. 安装Scala Sc ...

  8. spring data mongodb 大数据量查询性能差的原因(20s 优化到2s)

    结论 通过反复查询原因,最终确定,数据库查询速度很快,最重要的是mongodb将查询出来的数据映射到实体属性中,这个过程太过耗费时间 优化1 通过使用temple来查询的语句 // 这个查询出来所有符 ...

  9. qq空间代码查询_Mysql千万级大数据查询优化经验,一点课堂(多岸学院)

    提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意) 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避 ...

最新文章

  1. [日期工具分享][Shell]为特定命令依次传入顺序日期执行
  2. 高等数学:第六章 定积分的应用(1)定积分的应用 平面图形的面积 立体体积
  3. 数学理论—— 蒙特卡洛近似
  4. uwsgi部署到nginx出现invalid request block size: 4161 (max 4096)...skip问题(亲测)
  5. 模型压缩:模型量化打怪升级之路-工具篇
  6. 设计模式--责任链模式--Java实现
  7. 算法高级(4)-遗传算法(Genetic Algorithm)简介
  8. Caused by: java.lang.ClassNotFoundException: org.springframework.orm.hibernate4.HibernateTemplate
  9. MySQL的select语法
  10. 基于mfc 组态软件_组态软件有哪些?InTouch、WinCC、组态王?
  11. Win10 分页缓冲池 过大
  12. 股票指数的四种加权方式
  13. Rest Stops
  14. Python:将Word转成HTML
  15. VAO 与 VBO 的前世今生
  16. Communication error with Jack server
  17. IDL的参数传递(五)
  18. 转大型分布式网站术语浅析
  19. java中除法和取余的若干注意
  20. PADS 9.5 acs文件导入失败

热门文章

  1. 清华大学《操作系统》(十二):临界区与锁
  2. php多文件上传存储到表,PHP 实现一种多文件上传的方法
  3. python 类变量(属性)和实例变量(属性
  4. DataReceivedEventHandler 委托 接收调用执行进程返回数据
  5. 在线mod计算机,MOD大师教程 手把手教你改造电脑机箱
  6. oracle闪回某个时间点的数据库,oracle11g 使用闪回查询恢复表到过去某一个时间点...
  7. vue php 文件上传,使用vue.js和laravel上传文件
  8. LeetCode27——Remove Element(移除数组中指定的元素)
  9. 关注 Imagine Cup 2010, 参与软件设计“最具人气奖”投票
  10. VS Code设置中文插件