一、简介

在MongoDB建立索引能提高查询效率,只需要扫描索引只存储的这个集合的一小部分,并只把这小部分加载到内存中,效率大大的提高,如果没有建立索引,在查询时,MongoDB必须执行全表扫描,在数据量大时,效率差别就很明显,对于包括一个没有索引的排序操作的查询,服务器必须在返回任何结果之前将所有的文档加载到内存中来进行排序。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。索引项的排序支持高效的相等匹配和基于范围的查询操作。

从mongoDB 3.0开始ensureIndex被废弃,使用 createIndex创建索引。

创建索引的语法:

db.collection.createIndex(keys,options)

参数

类型

描述

keys

document

一个包含该字段的字段和值对的文档,该文档的索引键和该值描述该字段的索引类型。对于某个领域的上升索引,指定一个值为1;对于下降的索引,指定一个值为1。

MongoDB支持几种不同的索引类型,包括文本,空间,和哈希索引。查看更多信息的索引类型。

options

document

在创建索引的时的限制条件

二、 索引的基本操作
       我们先插入10w条记录

for(var i=0;i<1000000;i++){
. db. orders.insert({
"onumber" : i,
"date" : "2015-07-02",
"cname" : "zcy"+i,
"items" :[ {
"ino" : i,
"quantity" : i,
"price" : 4.0
},{
"ino" : i+1,
"quantity" : i+1,
"price" : 6.0
}
]
})
}

1.      默认索引
          存储在MongoDB集合中的每个文档(document)都有一个默认的主键“_id“,如果我们在添加新的文档时,没有指定“_id“值时,MongoDB会创建一个ObjectId值,并创建会自动创建一个索引在“_id“键上,默认索引的名称是”_id_“,并无法删除,如下面的命令查看:

>db.orders.getIndexes()

2.       查看索引信息
              返回一个数组,该数组保存标识和描述集合上现有索引的文档列表,可以查看我们是否有对某个集合创建索引,并创建哪些索引,方便我们管理。

语法:

>db.collection.getIndexes()

3.      创建单列索引
              我们对文档单个字段创建索引或者对内嵌文档的单个字段创建索引

语法:

db.collection.createIndex({field:boolean} })
                   boolean:对于某个领域的上升索引,指定一个值为1;对于下降的索引,指定一个值为1。

(1)创建

例子:

>db.orders.createIndex({cname:1})

我们对orders集合创建了cname索引,默认的索引名称是”cname_1“

(2)根据条件查询文档,并查看查询效率怎么样

例子:

> db.orders.find({"cname":"zcy100000"})
                    我们查询orders 集合根据条件cname为zcy100000的文档

我们测试有建索引和没建索引在1000000条文档执行查询的效率怎么样,我们这边先使用explain()函数,下一篇我们介绍

我们这边先介绍几个参数

1) n:当前查询返回的文档数量。

2)millis:当前查询所需时间,毫秒数。

3)indexBounds:当前查询具体使用的索引

例子:

> db.orders.find({"cname":"zcy100000"}).explain()

1)没建索引时,查询条件cname为zcy100000的文档

返回一个记录,花费1006毫秒,没使用到索引

2)有建索引,查询条件cname为zcy100000的文档

返回一个记录,花费82毫秒,有使用到cname索引

我们结果是相差很大的,有建索引字段,查询效率比较高,在大数据时,差别更明显。

(3)查询和排序组合使用

我们查询集合cname大于zcy100的文档并对onumber进行降序排序

例子:

>db.orders.find({"cname":{$gt:"zcy1000"}}).sort({"onumber":1}).explain()

执行出现错误:

"$err" : "Runner error:Overflow sort stage buffered data usage of 33554456 bytes exceeds internal limit of 33554432 bytes",

我们的内存只有33554432字节,对于包括一个没有索引的排序操作的查询,服务器必须在返回任何结果之前将所有的文档加载到内存中来进行排序。

我们对onumber创建索引

> db.orders.createIndex({onumber:-1})

这次我们在执行时,可以正常执行,已经减少了内存的缓存的数据

4.       创建组合索引
             我们可以同时对多个键创建组合索引

语法:

db.collection.createIndex({field1:boolean, field2:boolean } })

说明:

db.collection.createIndex({a:1,b:1,c:1 } })

我们对a、b、c进组合创建索引,支持查询时会用到索引的几种:

1)      a

2)      a,b

3)      a,b,c

这三中的查询条件,会使用到索引

(1)      创建组合索引

我们同时对onumber和cname进行组合索引

例子:

>db.orders.createIndex({cname:1,onumber:-1})
          
          索引存储在一个易于遍历读取的数据集合中,存储的数据

{_id:..,"onumber" : 2, "date" : "2015-07-02", "cname" : "zcy1"})

{_id:..,"onumber" : 1, "date" : "2015-07-02", "cname" : "zcy1"})

{_id:..,"onumber" : 1, "date" : "2015-07-02", "cname" : "zcy2"})

(2) 查询

1)我们对cname和onumber作为查询条件时

例子:

>db.orders.find({"cname":{$gt:"zcy1000"},"onumber":2000}).explain()

我们查询条件cname大于zcy1000并且onumber等于2000的数据,我们用explain()查询索引使用情况

2)我们只用两个索引其中一个作为查询时

第一种情况:我们条件只使用"cname":{$gt:"zcy1000"}作为查询条件

例子:

>db.orders.find({"cname":{$gt:"zcy1000"}}).explain()

会使用到索引,符合我们前面介绍的我们对a、b、c进组合创建索引,支持查询时会用到索引的第一种。

第二种情况:我们条件只使用"onumber":2000作为查询条件

例子:

> db.orders.find({"onumber":2000}).explain()

不会使用到索引,不符合我们前面介绍的我们对a、b、c进组合创建索引,支持查询时会用到几种。

(3)查询和排序组合使用

我们查询集合cname大于zcy100的文档并对onumber进行降序排序

例子:

>db.orders.find({"cname":{$gt:"zcy1000"}}).sort({"onumber":1}).explain()

执行出现错误:

"$err" : "Runner error:Overflow sort stage buffered data usage of 33554456 bytes exceeds internal limit of 33554432 bytes",

sort时,不会使用到索引,不符合我们前面介绍的我们对a、b、c进组合创建索引,支持查询时会用到几种。

总结:我们在使用组合索引时,查询时会用到组合索引的前端的几种组合。

我们对a、b、c进组合创建索引,支持查询时会用到索引的几种:

1)      a

2)      a,b

3)      a,b,c

5.      内嵌文档的索引
            我们对内嵌文档创建索引时,跟基本文档创建索引一样

语法:

db.collection.createIndex({field:boolean} })
            field说明:以“.“来指明内嵌文档的路径

(1)      单列的内嵌文档的索引创建

例子:

>db.orders.createIndex({"items.info":1})

我们orders集合下的内嵌items集合的info字段创建索引

我们以items.info字段作为查询条件,并使用索引的情况

例子:

>db.orders.find({"items.info":{$lt:100}}).explain()

我们查询items.info小于100的数据

(2)      组合的内嵌文档的索引的创建

我们对内嵌文档创建组合索引时,跟基本文档创建组合索引一样

语法:

>db.collection.createIndex({field1:boolean, field2:boolean } })

例子:

>db.orders.createIndex({"items.info":1, "items. quantity":-1})

6.      删除索引
      我们对已经创建的索引进行删除,可以针对具体的集合中索引进行删除,也可以对所有的集合中的所有索引删除

(1)具体索引名称删除索引

语法:

db.collection.dropIndex(index)

删除具体的索引,根据索引名称删除,如果不知道索引的名称,可以通过db.collection.getIndexes()查看索引名称

例子:

> db.orders.dropIndex("cname_1")

我们删除cname字段的索引,现在只剩下onumber字段索引

(2)删除集合中所有索引

语法:

db.collection.dropIndexes()

例子:

> db.orders.dropIndexes()

我们对集合中的索引都删除,我们删除cname字段的索引和onumber字段索引,现在只剩默认的_id字段索引,索引我们在使用时,要谨慎,以免把集合中的索引都删除。

(3)对dropIndexes方法,我们还有一种用法,可以指定集合的具体索引的删除

例子:

> db.runCommand({"dropIndexes":"orders","index":"cname_1"})

我们删除cname字段的索引,现在只剩下onumber字段索引

总结:

在MongoDB建立索引能提高查询效率,但在MongoDB新增、修改效率上比较慢

MongoDB索引基本操作的更多相关文章

  1. 学习MongoDB 八: MongoDB索引(索引限制条件)(二)

    一.简介 我们上一篇介绍了索引基本操作,通过db.collection.createIndex(keys, options)语法创建索引,我们继续介绍地理空间索引.索引的限制,使我们在MongoDB时 ...

  2. [DataBase] MongoDB (7) MongoDB 索引

    MongoDB 索引 1. 建立索引 唯一索引db.passport.ensureIndex( {"loginname": 1}, {"unique": tru ...

  3. mongodb的基本操作与插入文档(document)

    一.mongodb的基本操作: 1.查看mongodb当前所有的databases : show dbs 2.选择数据库(database) : use databaseName(该数据库不存在则会自 ...

  4. MongoDB索引介绍

    MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...

  5. MongoDB(索引及C#如何操作MongoDB)(转载)

    MongoDB(索引及C如何操作MongoDB) 索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureInd ...

  6. MongoDB索引(一)

    原文地址 一.介绍 我们已经很清楚索引会提高查询效率.如果没有索引,MongoDB必须对全部集合进行扫描,即,扫描集合中每条文档以选择那些符合查询条件的文档.对查询来说如果存在合适的索引,则Mongo ...

  7. MongoDB 索引篇

    MongoDB 索引篇 索引的简介 索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度.且添加索引之后的对文档的删除,修改会比以前速度慢.因为在进行修改的时候会对索引进行更新 ...

  8. 【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

    [网络爬虫入门05]分布式文件存储数据库MongoDB的基本操作与爬虫应用 广东职业技术学院  欧浩源 1.引言 网络爬虫往往需要将大量的数据存储到数据库中,常用的有MySQL.MongoDB和Red ...

  9. MongoDB之基本操作与日常维护

    MongoDB基本操作 MongoDB的基本操作主要是对数据库.集合.文档的操作,包括创建数据库.删除数据库.插入文档.更改文档.删除文档.和查询文档. 操作 描述 show dbs 查看当前实例下的 ...

随机推荐

  1. Luogu P5284 [十二省联考2019]字符串问题

    好难写的字符串+数据结构问题,写+调了一下午的说 首先理解题意后我们对问题进行转化,对于每个字符串我们用一个点来代表它们,其中\(A\)类串的点权为它们的长度,\(B\)类串的权值为\(0\) 这样我 ...

  2. MySQL 文章目录

    MySQL系列: MySQL CREATE TABLE语法 MySQL 复制表结构 MySQL 对比数据库表结构 MySQL 处理插入过程中的主键唯一键重复值办法 MySQL 启动原理剖析 MySQL ...

  3. 双因素认证(2FA)教程

    所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤. 密码是最常见的认证方法,但是不安全,容易泄露和冒充. 越来越多的地方,要求启用 双因素认证(Two-factor ...

  4. TCP三次握手和四次挥手的全过程

    三次握手: 第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认:第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个 ...

  5. java SE Development kit 8 Update 201 (64-bit) 的安装相关

    登录http://www.oracle.com,下载JDK(J2SE) JDK 1.0,1.1,1.2,1.3,1.4 1.5 (JDK5.0) à支持注解.支持泛型   1.6(JDK6.0) à ...

  6. Java实现单链表

    真正的动态数据结构(引用和指针) 优点:真正的动态,不需要处理固定容量的问题. 缺点:丧失随机访问的能力. 链表就像寻宝,我们拿到藏宝图开始出发寻宝,每找到一个地方后,里面藏着下一步应该去哪里寻找.一 ...

  7. springboot~集成测试里的redis

    测试不应该访问外部资源 对于单元测试,集成测试里,如果被测试的方法中使用到了redis,你需要去模拟一个单机环境的redis server,因为只有这样,你的测试才是客观的,即不会因为网络和其它因素影 ...

  8. Jenkins|简单Job配置|启动脚本|测试报告

    目录 1.Jenkins安装 2.Jenkins启动脚本 3.节点配置 4.任务配置 5.集成HTML测试报告 1.Jenkins安装 操作环境:Ubuntu jenkins针对windows,ubu ...

  9. .NET CAD二次开发学习第一天

    基于浩辰CAD2019 需求: 开发线转圆简单命令.命令过程:1) 请选择图中直线(要求支持一次选多个):2) 弹出对话框,输入圆的图层名和半径3) 点对话框中确定按钮,结束命令.命令执行效果:所选每 ...

  10. phpstorm 代码注释后,撤销某段代码的注释的,快捷键是什么?

    phpstorm 的代码注释有两种风格,一种是双斜杠,另一种是 /* ...  */风格,两者的快捷键都是开关式(即按第一次为注释,再按一次为撤销注释),快捷键如下: 1.双斜杠注释   Ctrl + ...