索引是用来加快查询的,这里不解说索引的原理和数据结构。事实上大部分数据库的索引就是B+Tree,想要了解的同学能够看索引原理,要掌握怎样为查询配置最佳索引会有些难度。

MongoDB索引差点儿和关系型数据库的索引一样.绝大数优化关系型数据库索引的技巧相同适用于MongoDB。

我们举一个样例,如今集合中插入多个文档:

db.lf.insert({“name”:”lf”,”age”:23,”isactive”:true})
db.lf.insert({“name”:”lf”,”age”:24,”isactive”:false})
db.lf.insert({“name”:”aaaa”,”age”:24,”isactive”:false})
db.lf.insert({“name”:”bbbb”,”age”:24,”isactive”:false})
db.lf.insert({“name”:”cccc”,”age”:24,”isactive”:false})
db.lf.insert({“name”:”aaaaa”,”age”:24,”isactive”:false})
db.lf.insert({“name”:”bbbb”,”age”:28,”isactive”:true})
db.lf.insert({“name”:”bbbb”,”age”:21,”isactive”:false})
db.lf.insert({“name”:”rrrr”,”age”:11,”isactive”:true})

接下来。我们该创建索引了。


创建索引

要依照name键进行查找,就能够在此键上建立索引,来提高查询速度。

使用ensureIndex方法来创建索引:

db.lf.ensureIndex({"name":1})

对某个键创建索引会加速对该键的查询,可是对于其它的查询可能没有帮助,即便查询中包括了被索引的键。

那么怎样查看自己创建了哪些索引呢?


查看索引

使用db.system.indexes.find()就能够查看自己创建的索引了。

能够看到,id是一定会有一个索引的,我们创建的name索引在后面。

这里要介绍一个概念,叫做表扫描,表扫描就是在没有索引的集合中查找内容,从第一个到最后一个。当集合过大时,这样的需找方式会显得非常慢,所以我们要避免表扫描。


删除索引

使用dropIndexes命令来删除索引。

比如:

> db.runCommand({"dropIndexes":"lf","index":"*"})
{
"nIndexesWas" : 2,
"msg" : "non-_id indexes dropped for collection",
"ok" : 1
}
> db.lf.ensureIndex({"name":1,"age":1})
> db.lf.ensureIndex({"name":1,"age":-1})
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.lf", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.lf", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.lf", "name" : "_id_" }
{ "v" : 1, "key" : { "name" : 1, "age" : 1 }, "ns" : "test.lf", "name"
: "name_1_age_1" }
{ "v" : 1, "key" : { "name" : 1, "age" : -1 }, "ns" : "test.lf", "name
" : "name_1_age_-1" }

能够看到,创建的全部会有一个name。在删除相应索引时指定名称即可了。

假设以{“age”:1, “name”:1,}这样的方式创建索引,MongoDB会按例如以下方式组织:



用户名安装字母升序排列,同名的组依照年龄升序排列。

创建索引的缺点是每次插入,更新,删除都会产生额外的开销,由于数据库不但须要运行这些操作,还要将这些操作在集合的索引中标记.因此,尽可能少的创建索引。

一般来说,要是查询要返回集合中一半以上的结果,用表扫描会比差点儿每条文档都要索引要快,所以,查询是否存在某个键,或者检查摸个布尔类型的值是真是假,就没有必要利用索引。


扩展索引

假设有个集合存储了用户的状态信息。如今要查询用户和日期,取出某一用户近期的状态.我们可能会建立例如以下索引:

db.users.ensureIndex({"user":1,"date":-1})

这会使对用户和日期的查询非常快,可是并非最好的方式。

由于应用会有数百万的用户,每人每天都有数十条状态更新.若是每条用户状态的索引值咱用相似一页纸的磁盘控件,那么对每次”最新状态”的查询,数据库将会将不同的页加载内存。若是网站太热门,内存放不下全部索引,就会非常慢。要是改变索引的顺序{“date”:-1,”user”:1},则数据库能够将最后几天的索引保存在内存中,能够有效的降低内存交换,这样查询不论什么用户的最新状态都会快非常多。


索引内嵌文档中的键

那么索引怎样作用于NoSQL复杂灵活的内嵌文档呢?

事实上和普通的没有什么差别,还是利用点操作符:

db.blog.insert(
  {
    "title":" blog",
    "author":
    {
      "name":"lf",
      "email":"362512489@qq.com"
    }  
  }
)

为author.name创建索引:

db.blog.ensureIndex({"author.name":1})

对内嵌文档的键索引和普通键索引没有什么差别。所以说两者能够联合组成复合索引。


索引名称

集合中的每个索引都有一个字符串类型的名字,来唯一标识索引,server通过这个名字来删除或操作索引.默认情况下,索引名相似

keyname1_dir1_keyname2_dir2

这样的形式,当中keyname代表索引的键,dir代表索引的方向(1或-1)。当然了,我们也能够通过ensureIndex来指定索引的名称:

db.blog.ensureIndex({"author.name":1},{"name":"author_name_index"})

注意一点,自己定义的索引名称是不能改动的,仅仅能通过删除索引再重建。


唯一索引

唯一索引能够确保集合的每个文档的指定键都有唯一值.假设想保证文档的username键都有不同的值:

db.lf.ensureIndex({"username":1},{"unique":true})

默认情况下,insert并不会去检測文档是否插入过。所以为了避免插入的文档包括与唯一键反复的值,可能要用到安全插入才干满足要求。


消除反复

当我们为已有的集合创建唯一索引的时候,可能有些值已经反复了,所以会创建失败。我们可能会希望价格全部包括反复值的文档都删掉,这个时候我们就能够使用dropDups方法,来保留发现的第一个文档而删除接下来的有反复值的文档:

db.lf.ensureIndex({"username":1},{"unique":true,"dropDups":true})

当然了。假设是关键数据,这样做未免显得有些鲁莽。还是写个脚本预处理比較好。

MongoDB之索引的更多相关文章

  1. MongoDB的索引(三)

    MongoDB的索引: 1. _id索引 该索引是大多数集合默认创建的索引,也就是说用户每插入一个数据,MongoDB会自动生成一条唯一的_id字段. 2. 单键索引 单键索引是最普通的索引,它不会自 ...

  2. MongoDB 覆盖索引查询

    MongoDB 覆盖索引查询 官方的MongoDB的文档中说明,覆盖查询是以下的查询: 所有的查询字段是索引的一部分 所有的查询返回字段在同一个索引中 由于所有出现在查询中的字段是索引的一部分, Mo ...

  3. MongoDB数据库索引

    前面的话 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录.这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查 ...

  4. MongoDB数据库索引构建情况分析

    前面的话 本文将详细介绍MongoDB数据库索引构建情况分析 概述 创建索引可以加快索引相关的查询,但是会增加磁盘空间的消耗,降低写入性能.这时,就需要评判当前索引的构建情况是否合理.有4种方法可以使 ...

  5. MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引

    这个系列文章会分为两篇来写: 第一篇:入门篇,学习使用MongoDB数据库索引 第二篇:进阶篇,研究数据库索引原理--B/B+树的基本原理 1. 准备工作 在学习使用MongoDB数据库索引之前,有一 ...

  6. MongoDb进阶实践之七 MongoDB的索引入门

    一.引言     好久没有写东西了,MongoDB系列的文章也丢下好长时间了.今天终于有时间了,就写了一篇有关索引的文章.一说到"索引",用过关系型数据库的人都应该知道它是一个什么 ...

  7. 给MongoDB添加索引

    用过数据库的都知道,数据库索引与书籍的索引类似,都是用来帮助快速查找的.   MongoDB的索引跟关系型数据库的索引几乎一致.       1. 索引的创建   mongodb采用ensureInd ...

  8. linux环境给mongodb创建索引

    首先我们来了解索引,如果有基础的可以直接看最后面的操作. 可参照 DoNotStop 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/u013725455/artic ...

  9. MongoDB复合索引详解

    摘要: 对于MongoDB的多键查询,创建复合索引可以有效提高性能. 什么是复合索引? 复合索引,即Compound Index,指的是将多个键组合到一起创建索引,这样可以加速匹配多个键的查询.不妨通 ...

  10. 五、MongoDB的索引

    一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 四.MongoDB的查询 五.MongoDB的索引 1.简介 它就像是一本书的目录,如果没 ...

随机推荐

  1. validate+jquery+ajax表单验证

    1.案例 1.1 Html form表单内容 <form class="cForm" id="cForm" method="post" ...

  2. Codeforces #442 Div2 E

    #442 Div2 E 题意 给你一棵树,每个结点有开关(0表示关闭,1表示开启),两种操作: 反转一棵子树所有开关 询问一棵子树有多少开关是开着的 分析 先 DFS 把树上的结点映射到区间上,然后就 ...

  3. 洛谷——P1358 扑克牌

    题目描述 组合数学是数学的重要组成部分,是一门研究离散对象的科学,它主要研究满足一定条件的组态(也称组合模型)的存在.计数以及构造等方面的问题.组合数学的主要内容有组合计数.组合设计.组合矩阵.组合优 ...

  4. 子域名/目录暴力工具Gobuster

    子域名/目录暴力工具Gobuster   Gobuster是Kali Linux默认安装的一款暴力扫描工具.它是使用Go语言编写的命令行工具,具备优异的执行效率和并发性能.该工具支持对子域名和Web目 ...

  5. 【枚举】URAL - 2081 - Faulty dial

    //._. ... ._. ._. ... ._. ._. ._. ._. ._. //|.| ..| ._| ._| |_| |_. |_. ..| |_| |_| //|_| ..| |_. ._ ...

  6. 【树状数组】【枚举约数】 - Ambitious Experiment

    给定一个序列,支持以下操作: 对区间[l,r]的每个i,将1i,2i,3i,...这些位置的数都加d. 询问某个位置的数的值. 如果把修改看作对区间[l,r]的每个数+d,那么询问x位置上的数时,显然 ...

  7. 快速创建Django验证码

    # 生成随机验证码图片 import stringfrom random import randint, samplefrom PIL import Image, ImageDraw, ImageFo ...

  8. ACM--素数距离问题

    题目描述:现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度.如果左右有等距离长度素数,则输出左侧的值及相应距离.如果输入的整数本身就是素数,则输出该素数本身,距离输出 ...

  9. JQuery提示$(...).on is not a function解决方法

    版本太低了,引入较高的版本,如jquery-1.8.3.min.js

  10. 网络采集软件核心技术剖析系列(5)---将任意博主的全部博文下载到内存中并通过Webbrower显示(将之前的内容综合到一起)

    一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...