一、简介

在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. Servlet生命周期 、Filter生命周期、Listering(监听器)总结

    Servlet生命周期简述 (1)加载和实例化 当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求:如果不存在 ...

  2. Sql Server 的参数化查询

    为什么要使用参数化查询呢?参数化查询写起来看起来都麻烦,还不如用拼接sql语句来的方便快捷.当然,拼接sql语句执行查询虽然看起来方便简洁,其实不然.远没有参数化查询来的安全和快捷. 今天刚好了解了一 ...

  3. Spring:(一)入门基础学习

    前述 因为前几日刚刚学完Spring的基础,因此写一篇博客整理一下相关的基础知识. 什么是Spring? Spring 是一个轻量级的 DI / IoC 和 AOP 容器的开源框架,帮助分离项目组件之 ...

  4. 09 使用Tensorboard查看训练过程

    打开Python Shell,执行以下代码: import tensorflow as tf import numpy as np #输入数据 x_data = np.linspace(-1,1,30 ...

  5. 从零开始学安全(四十四)●TCP三次握手四次挥手

    wireshark:Beyond Compare是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与 ...

  6. Linux高级运维 第五章 Vim编辑器和恢复ext4下误删除的文件-Xmanager工具

    5.1  vim主要模式介绍,vim命令模式. 确保系统已经安装了VIM工具 [root@panda ~]# rpm -qf `which vim` [root@panda ~]# rpm -qf ` ...

  7. 数据结构——Java实现顺序栈

    一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 顺序栈是指利用顺序存储结构实现 ...

  8. java爬虫系列第五讲-如何使用代理防止爬虫被屏蔽?

    本文内容 1.分析一下爬虫存在的问题及解决方案 2.webmagic中代理的使用 3.目前市面上一些比较好用的代理服务器 存在的问题 我们在使用爬虫过程中,大多都会遇到这样的问题:突然某一天爬虫爬不到 ...

  9. 001. Java内存中的字符编码

    Java内存中的字符编码 Unicode字符集及utf-8 .utf-16.utf-32 等字符编码方式 字符集:字符表示的数字集合,元素称为码点或码位: 字符编码:字符实际的储存表示: 码点:一个码 ...

  10. loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)

    题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...