MongoDB学习笔记(六)
初识 MongoDB 中的索引
索引就像图书的目录一样,可以让我们快速定位到需要的内容,关系型数据库中有索引,NoSQL 中当然也有,本文我们就先来简单介绍下 MongoDB 中的索引。
索引创建
默认情况下,集合中的 _id
字段就是索引,我们可以通过 getIndexes() 方法来查看一个集合中的索引:
1 |
db.sang_collect.getIndexes() |
结果如下:
1 |
[ |
我们看到这里只有一个索引,就是 _id
。
现在我的集合中有 10000 个文档,我想要查询 x 为 1 的文档,我的查询操作如下:
1 |
db.sang_collect.find({x:1}) |
这种查询默认情况下会做全表扫描,我们可以用上篇文章介绍的 explain() 来查看一下查询计划,如下:
1 |
db.sang_collect.find({x:1}).explain("executionStats") |
结果如下:
1 |
{ |
结果比较长,我摘取了关键的一部分。我们可以看到查询方式是全表扫描,一共扫描了 10000 个文档才查出来我要的结果。实际上我要的文档就排第二个,但是系统不知道这个集合中一共有多少个 x 为 1 的文档,所以会把全表扫描完,这种方式当然很低效,但是如果我加上 limit,如下:
1 |
db.sang_collect.find({x:1}).limit(1) |
此时再看查询计划发现只扫描了两个文档就有结果了,但是如果我要查询 x 为 9999 的记录,那还是得把全表扫描一遍,此时,我们就可以给该字段建立索引,索引建立方式如下:
1 |
db.sang_collect.ensureIndex({x:1}) |
1 表示升序,-1 表示降序。当我们给 x 字段建立索引之后,再根据 x 字段去查询,速度就非常快了,我们看下面这个查询操作的执行计划:
1 |
db.sang_collect.find({x:9999}).explain("executionStats") |
这个查询计划过长我就不贴出来了,我们可以重点关注查询要耗费的时间大幅度下降。
此时调用 getIndexes() 方法可以看到我们刚刚创建的索引,如下:
1 |
[ |
我们看到每个索引都有一个名字,默认的索引名字为 字段名_排序值
,当然我们也可以在创建索引时自定义索引名字,如下:
1 |
db.sang_collect.ensureIndex({x:1},{name:"myfirstindex"}) |
此时创建好的索引如下:
1 |
{ |
当然索引在创建的过程中还有许多其他可选参数,如下:
1 |
db.sang_collect.ensureIndex({x:1},{name:"myfirstindex",dropDups:true,background:true,unique:true,sparse:true,v:1,weights:99999}) |
关于这里的参数,我说一下:
- name 表示索引的名称
- dropDups 表示创建唯一性索引时如果出现重复,则将重复的删除,只保留第一个
- background 是否在后台创建索引,在后台创建索引不影响数据库当前的操作,默认为 false
- unique 是否创建唯一索引,默认 false
- sparse 对文档中不存在的字段是否不起用索引,默认 false
- v 表示索引的版本号,默认为 2
- weights 表示索引的权重
此时创建好的索引如下:
1 |
{ |
查看索引
上文我们介绍了 getIndexes() 可以用来查看索引,我们还可以通过 totalIndexSize() 来查看索引的大小,如下:
1 |
db.sang_collect.totalIndexSize() |
删除索引
我们可以按名称删除索引,如下:
1 |
db.sang_collect.dropIndex("xIndex") |
表示删除一个名为xIndex的索引,当然我们也可以删除所有索引,如下:
1 |
db.sang_collect.dropIndexes() |
总结
索引是个好东西,可以有效的提高查询速度,但是索引会降低插入、更新和删除的速度,因为这些操作不仅要更新文档,还要更新索引,MongoDB 限制每个集合上最多有 64 个索引,我们在创建索引时要仔细斟酌索引的字段。
好了,MongoDB 中的索引入门我们就说到这里,小伙伴们有问题欢迎留言讨论。
参考资料:
- 《MongoDB权威指南第2版》
MongoDB学习笔记(六)的更多相关文章
- MongoDB学习笔记六:进阶指南
[数据库命令]『命令的工作原理』MongoDB中的命令其实是作为一种特殊类型的查询来实现的,这些查询针对$cmd集合来执行.runCommand仅仅是接受命令文档,执行等价查询,因此,> db. ...
- MongoDB学习笔记六—查询下
查询内嵌文档 数据准备 > db.blog.find().pretty() { "_id" : ObjectId("585694e4c5b0525a48a441b5 ...
- MongoDB学习笔记(六) MongoDB索引用法和效率分析
MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...
- MongoDB学习笔记(转)
MongoDB学习笔记(一) MongoDB介绍及安装MongoDB学习笔记(二) 通过samus驱动实现基本数据操作MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB ...
- MongoDB学习笔记(六)--复制集+sharding分片 && 总结
复制集+sharding分片 背景 主机 IP 服务及端口 Server A ...
- MongoDB学习笔记(五)--复制集 && sharding分片
主从复制 主从节点开启 主节 ...
- MongoDB学习笔记:快速入门
MongoDB学习笔记:快速入门 一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...
- MongoDB学习笔记系列
回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...
- PHP操作MongoDB学习笔记
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
随机推荐
- Asp.Net MVC强类型页面获取值几种方式
方式一 (V:视图) @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="v ...
- 关于创建node服务
1.环境条件准备: A.确定node已经创建 B.npm或cnpm已经下载,npm和cnpm其实是一个道理 C.mysql或者使用其他数据库已经安装(本例使用mysql) 2.开始创建,首先新建一个文 ...
- jQuery-ready与load
// ready 在DOM加载完成时运行的代码 $(document).ready(function(){ // 在这里写代码... }) // 可以简写为 $(function(){ // 在这 ...
- Android RadioButton控件
RadioButton 单选按钮 常用属性: text 文本 checked=“true” 默认选中 一组互斥的单选按钮要放在RadioGroup中.RadioGroup常用属性: orienta ...
- Arcgis CreateFishnet工具,生成到FileGDB中要素类的格网大小不一致
我的第一篇博客!哈哈 最近在做一些关于创建渔网的工作,发现一些问题,做个总结. 1.问题描述:如图1,设置好渔网的必要参数,输出目录为gdb里的矢量图层,(行列数比较大,渔网的地理范围较小),输出的格 ...
- 谈谈<? extends T> 和<? super T>理解
项目中遇到<? extends T> 和<? super T> 这两者,来说说自己的理解.首先我们先了解什么是泛型 什么是泛型 泛型是在编译阶段一种防止错误对象输入的机制.编译 ...
- 《2019面向对象程序设计(java)课程学习进度条
周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序 阅读或编译让我 第一周 20/5 1/0 4 编译九九乘法表 第二周 100/10 2/0 5 第 ...
- python处理JSON 序列化与反序列化
#序列化 >>> import json>>> d={"key":"value"}>>> d{'key': ...
- Machine Learning in Finance – Present and Future Applications
https://emerj.com/ai-sector-overviews/machine-learning-in-finance/ Machine learning has had fruitful ...
- NOIP 2003 乒乓球
洛谷 P1042 乒乓球 https://www.luogu.org/problemnew/show/P1042 JDOJ 1363: [NOIP2003]乒乓球 T1 https://neooj.c ...