MongoDB 学习笔记(四):索引
一、索引的基本使用
1、建立索引
在shell中为某个key建立索引的方法为:db.集合名.ensureIndex({key:1}),其中的key表示为哪个key建立索引,1表示升序建立索引,而-1表示降序建立索引,如下图:为age这个键升序建立索引。
2、在shell中查看数据库已建立的索引
在system.indexes和system.namespaces集合中能看到数据库已建立的索引,如下图:之前有将结果,当插入一条文档到集 合中时,如果该文档没有“_id”键时,系统会默认为文档加上该键,而从下图结果中可以发现,系统还会默认为“_id”键建立索引。
3、索引名称
从上图中可以看到刚刚为age这个key升序建立的索引名字是“age_1”。当建立索引时,如果没指定索引的名称,索引的名称默认是 “key_1/-1”,也就是建立索引的那个键的名字加上下划线,再加上1(升序)或-1(降序)。也可以在建立索引时指定索引的名称,使用方式是使用 ensureIndex函数的第二个参数指定name键,如下图:为age键建立倒序索引,并指定名称为“$index_age_-1”。
4、唯一索引
建立唯一索引是使用ensureIndex函数的第二个参数,指定unique键为true,如下图:为name键建立升序的唯一索引,并指定索引名字。
这样建立唯一索引后,当再次插入一条文档,而该文档的name键的值已存在了就不能插入该文档了。但是如果在为某个key建立唯一索引之前,该集合 的所有文档中这个key的值已经存在重复的情况了,如果是在这种情况下为该key建立唯一索引,则要使用ensureIndex函数的第二个参数,指定 dropDups键为true,如下图:指定了dropDups键为true后,它会删除在这个要建立索引的key上重复的数据,只保留一条。
5、hint:在查询时强制使用指定的索引
前提是指定使用的索引必须是已经成功创建了的,如下图:
二、空间索引(2D索引)
1、有如下一个坐标系,其中有14个点,将每一个点(x,y)存入MongoDB数据库中成为一个文档。
2、为以上建立的coordinate集合中的gis键建立空间索引,如下图:如果不写第二个参数,则默认会建立一个[-180, 180]之间的空间索引。
3、在以上的基础上,查询离点(25,25)最近的三个点(包含本身),如下图:
4、查询以点(35,15)和点(50,0)为对角线的正方形中所有的点,如下图:
5、查询以点(40,10)为圆心,半径为10的圆中的点,如下图:
三、索引管理
1、删除索引
在删除索引时可以指定要删除的索引的名字而执行精确删除,还可以使用*号来进行批量删除,shell命令为:db.runCommand({dropIndexes:"集合名", index:"索引名或*号"}),如下图:从结果中发现不能删除默认给_id键生成的索引。
2、执行创建索引的过程中会暂时锁表,为了不影响查询可以让索引的创建过程在后台执行,即指定ensureIndex函数的第二个参数的background键为true即可,如下:
四、其他
1、explain函数
执行查询时,详细查看本次查询使用的索引和状态信息,就是关系型数据库中的查询计划,如下图:结果中cursor代表的就是使用的索引。
2、使用索引注意点
- 索引的创建在提高查询性能的同时会降低插入的性能,因为在插入文档时还需要对索引进行维护,对于经常查询而少插入的情况可以考虑使用索引。
- 复合索引应根据实际业务情况注意索引的先后顺序。
- 在做排序时如果是超大数据量也可以考虑加上索引来提高排序的性能。
MongoDB 学习笔记(四):索引的更多相关文章
- mongodb学习笔记之索引(转)
一.索引基础: MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令: > db.test.ensureIndex({" ...
- MongoDB学习笔记四:索引
索引就是用来加速查询的.创建数据库索引就像确定如何组织书的索引一样.但是你的优势是知道今后做何种查询,以及哪些内容需要快速查找.比如:所有的查询都包括"date"键,那么很可能(至 ...
- Mongodb学习笔记四(Mongodb聚合函数)
第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...
- MongoDB学习总结(四) —— 索引的基本用法
说到索引,大家肯定都在关系型数据库或多或少接触过,它的主要目的是加速查询的速度.MongoDB作为一种数据库,当然也提供了索引的操作. 我们先插入1万条测试数据. 首先,我们先来看看不加索引查找nam ...
- MongoDB学习笔记-04 索引
索引是用来加速查询的.有了索引之后,数据库不必进行全表扫描,只需先在索引中查找,再根据找到的索引查找数据.MongoDB的索引几乎和传统关系型数据库一样. 创建索引 创建索引是在相应的集合中使用ens ...
- MongoDB学习笔记(四) 用MongoDB的文档结构描述数据关系
MongoDB的集合(collection)可以看做关系型数据库的表,文档对象(document)可以看做关系型数据库的一条记录.但两者并不完全对等.表的结构是固定的,MongoDB集合并没有这个约束 ...
- MongoDB 学习笔记四 C#调用MongoDB
驱动 下载 https://github.com/mongodb/mongo-csharp-driver/downloads 项目地址: https://github.com/mongodb/mong ...
- MongoDB 学习笔记之 索引
索引: db.media.createIndex({"Tracklist": 1}) 1表示升序 -1表示降序 我们要着重看一下对数组创建索引的情况. 构建一个集合:db.medi ...
- MongoDB 学习笔记之 索引选项和重建索引
索引选项: {background:true}在后台创建索引,索引在构建过程中,其他客户端仍然可以查询数据,不会阻塞. db.comments.createIndex({anonymous: 1},{ ...
- MongoDB学习笔记四—增删改文档下
$slice 如果希望数组的最大长度是固定的,那么可以将 $slice 和 $push 组合在一起使用,就可以保证数组不会超出设定好的最大长度.$slice 的值必须是负整数. 假设$slice的值为 ...
随机推荐
- PAT 1088. Rational Arithmetic
For two rational numbers, your task is to implement the basic arithmetics, that is, to calculate the ...
- 学习EXTJS6(3)基本概念
ExtJS不再纠缠HTML和CSS上.概念和传统的程序相近.如面板panel,布局Layout.组件Component等等. 1.渲染Render:ExtJS页面在浏览器中装载完成后完全展现出来的一个 ...
- Maven学习总结(26)——maven update时,报:Preference node "org.eclipse.wst.validation"...
详细情况如下: An internal error occurred during: "Updating Maven Project". Preference node " ...
- poj 3177&&poj 3352加边构双联通(有重边)用tarjan 模板求的
#include<stdio.h>/* 求边双联通分量和求强连通差不多,先缩点求出叶子节点的个数 */ #include<string.h> #define N 5100 st ...
- JAVA的输入输出基本操作样例
这些类的继承关系有些类似,弄一个作为样例,理解一下其中的机制. package cc.openhome; import java.io.*; public class Member { private ...
- [bzoj1861][Zjoi2006]Book 书架_非旋转Treap
Book 书架 bzoj-1861 Zjoi-2006 题目大意:给你一个序列,支持:将指定编号的元素抽出,放到序列顶(底):将指定编号元素左右篡位:查询指定编号元素位置:查询指定数量位置元素编号. ...
- K - Transformation
K - Transformation HDU - 4578 思路:发现自己的错误竟然是zz般的少了一个取模 ε=ε=ε=(#>д<)ノ #include<cstdio> # ...
- HDU 1912
坑,直接把公路看成X轴来做,然后,排序扫描一下,你懂的. #include <iostream> #include <algorithm> #include <cstdi ...
- 初探BurpSuite
BurpSuite这套渗透软件.或者已经能够说是渗透攻击平台了吧,玩的好.确实非常方便. 就像是玩英雄联盟的ADC,一開始玩VN.感觉非常难上手,玩多了肯定会爱上VN(啊,貌似提到了什么奇怪的东西). ...
- Linux中修改系统时间
#date //显示当前日期 #date -s //设置当前时间,只有root权限才能设置,其他只能查看. #date -s 20061010 //设置成20061010,这样会把具体时间设置成空00 ...