MongoDB学习笔记-04 索引

索引是用来加速查询的。有了索引之后,数据库不必进行全表扫描,只需先在索引中查找,再根据找到的索引查找数据。MongoDB的索引几乎和传统关系型数据库一样。

创建索引

创建索引是在相应的集合中使用ensureIndex()方法。

>db.user.ensureIndex({"username":1})

要创建查询中用到的所有键的索引。传递给ensureIndex方法的文档形式与传递给sort的一样:1或-1表示索引的方向。若索引只有一个键时,方向则无关紧要。

>db.user.ensureIndex({"username":1, "age":-1})

一般来说,如果包含N个件的索引,则对前几个键的查询都会有帮助,如索引:{"a":1,"b":1,"c":1,…,"z":1}实际上就有了{"a":1}、{"a":1,"b":1}、…等索引。

创建索引的缺点是每次插入、更新和删除时都会产生额外的开销,因为数据库不但需要执行这些操作,还要将这些操作在集合的索引中标记。

建索引时需要考虑的问题

1)会做什么样的查询?哪些键需要索引?

2)每个键的索引方向是怎样的?

3)如何应对扩展?有没有种不同键的排列可以使常用数据更多地保留在内存中?

内嵌文档的键索引和普通键索引并无差异。

索引名称

集合中的每个索引都有一个字符串类型的名字,来唯一标识索引,服务器通过这个名字来删除或者操作索引。默认情况下,索引的名字类似于:keyname1_dir1_keyname2_dir2…

keynameX表示索引的键,dirX表示索引的方向。

可以通过ensureIndex的选项来指定自定义的名字:

>db.user.ensureIndex({"a":1,"b":1,"c":1,…,"z":1},{"name":"indexName"})

唯一索引

唯一索引可以确保集合的每个文档的指定键都有唯一的值。

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

集合中的默认唯一所以_id是在集合创建时一同创建,且不能删除。

消除重复

当为已有的集合创建索引,可能有些值已经有重复,此时创建唯一索引便会失败。可以通过dropDups选项来保留发现的第一个文档,而删除接下来的有重复值的文档:

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

注意:这种做法要慎重,如果数据重要的话,比较稳妥的办法是写个脚本进行预处理。

复合唯一索引

复合唯一索引,单个键的值可以相同,只要所有键的值组合起来不同即可。

>db.user.ensureIndex({"username":1, "age":-1},{"unique":true })

使用explain和hint

explain可以对查询做分析。而hint可以强制使用某个索引:

>db.user.find({"age":14,"username":"wangdh"}).hint({"username":1,"age":1})

管理索引

索引的元数据信息存储在每个数据库的system.indexes集合中,该集合是只读的。只能通过ensureIndex或者dropIndexes进行。

1)修改索引

>db.user.ensureIndex({"username":1},{"background":true})

Background选项可以在后台执行,避免数据库建索引时阻塞请求。

为已有文档创建索引比先创建索引再插入所有文档要稍快一点。

2)删除索引

使用dropIndexes加上索引名可以删除索引。

>db.runCommand({"dropIndexes":"collectionName","index":"indexName"})

删除集合也可以删除索引,删除集合的所有文档并不会影响到索引。

地理空间索引

MongoDB还提供了空间地理索引,并提供了相关的查询

时间: 2024-12-10 04:18:12

MongoDB学习笔记-04 索引的相关文章

mongodb学习笔记之索引(转)

一.索引基础:    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令:    > db.test.ensureIndex({"username":1})    可以通过下面的名称查看索引是否已经成功建立:    > db.test.getIndexes()    删除索引的命令是:    > db.test.dropIndex({"username":1})    在MongoDB中,我们

MongoDB学习笔记04

创建索引使用ensureIndex方法,对于同一个集合,同样的索引只需要创建一次,反复创建是徒劳的. 对某个键的索引会加速对该键的查询,然而,对于其它查询可能没有帮助,即便是查询中包含了被索引的键.实践证明,一定要创建查询中用到的所有键的索引 一般来说,如果索引包含N个键,则对于前几个键的查询都会有帮助,如有个索引{"a":1,"b":1,"c":1},实际上是有了{"a":1}.{"a":1,"

MongoDB 学习笔记之 索引

索引: #查看执行计划 db.stu.find().explain(); #创建索引(无此列的记录也会创建索引) db.bar.ensureIndex({content: 1}) #查看索引 db.bar.getIndexes() #删除索引 db.bar.dropIndex({content: 1}) #创建多列索引 db.bar.ensureIndex({content: 1, title: -1}) #查询子文档 db.shop.find({'spc.area':'taiwan'}); #

MongoDB学习笔记系列

回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助和启发,文章中有对新技术的研究(Mongo驱动),对老技术的回顾(代码重构),还有对架构设计的阐述等(面向接口编程,对扩展开放,对修改关闭,所以出现了IMongoRepository接口). MongoDB学习笔记系列~目录 MongoDB学习笔记~环境搭建 (2015-03-30 10:34) M

【OpenGL 学习笔记04】顶点数组

通过之前的学习,我们知道,如果要绘制一个几何图形,那就要不断的调用绘制函数,比如绘制一个20条边的多边形,起码要调用22条函数(包含glBegin和glEnd). 所以OpenGL提供了一系列的顶点数组函数减少函数调用的次数来提高性能.而且使用顶点还可以避免顶点共享的冗余处理. 1.简单示例 先来回顾一下之前我们是怎么画直线的: void drawOneLine(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2) { glBegin(GL_LINES); g

SWIFT学习笔记04

1.在实际编译时,Swift 编译器会优化字符串的使用,使实际的复制只发生在绝对必要的情况下,这意味着您将字符串作为值类型的同时可以获得极高的性能. 2.for character in "Dog!" { println(character) } // D // o // g // ! 3.通过标明一个Character类型注解并通过字符字面量进行赋值,可以建立一个独立的字符常量或变量: let yenSign: Character = "¥" 4.计算字符数量 l

MongoDB 学习笔记一 安装以及基础命令

一.MongoDB安装配置 1.获取最新版本: wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.2.tgz 2.解压缩即可执行 tar zxvf mongodb-linux-x86_64-2.0.2.tgz tar zxvf mongodb-linux-x86_64-2.0.2.tgz cd /usr/mongodb-linux-x86_64-2.0.2/bin 但是在运行前,需要创建mongodb需要的存放数据和日志的

MongoDB学习笔记一 ID自增长

以下是官网原文地址: http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/ 概要 MongoDB 的_id字段作为一个主键存在于所有文档的最顶层,_id必须是唯一的,而且总是具有唯一约束的索引.除了唯一约束,你可以在集合中的_id字段上使用任何值, 以下这个指南描述了在_id上创建一个自增序列的两种方式: Use Counter Collection Optimistic Loop 注意事项 一般情况

MongoDB 学习笔记(一)基础篇

1.MongoDB 特点 面向集合存储,存储对象类型的数据方便 模式自由,不需要定义任何模式(schma) 动态查询 完全索引,包含内部对象 复制和故障恢复方便 高效的二进制数据存储 支持c# 平台驱动 2.体系结构 一台服务器可以创建多个Server 实例和数据库,(推荐一天server 机器创建一个实例), 数据库:MongoDB 中的一系列与磁盘有关的物理文件(数据文件,日志文件等). 数据逻辑结构:文档 (documnet) 集合(collection) 数据库(database). d