出处:http://www.cnblogs.com/stephen-liu74/archive/2012/08/01/2561557.html
一、索引基础:
MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧。下面是创建索引的命令:
> db.test.ensureIndex({"username":1})
可以通过下面的名称查看索引是否已经成功建立:
> db.test.getIndexes()
删除索引的命令是:
> db.test.dropIndex({"username":1})
在MongoDB中,我们同样可以创建复合索引,如:
-- 数字1表示username键的索引按升序存储,-1表示age键的索引按照降序方式存储。
> db.test.ensureIndex({"username":1, "age":-1})
该索引被创建后,基于username和age的查询将会用到该索引,或者是基于username的查询也会用到该索引,但是只是基于age的查询将不会用到该复合索引。因此可以说,如果想用到复合索引,必须在查询条件中包含复合索引中的前N个索引列。然而如果查询条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB可以智能的帮助我们调整该顺序,以便使复合索引可以为查询所用。如:
> db.test.find({"age": 30, "username": "stephen"})
对于上面示例中的查询条件,MongoDB在检索之前将会动态的调整查询条件文档的顺序,以使该查询可以用到刚刚创建的复合索引。
我们可以为内嵌文档创建索引,其规则和普通文档没有任何差别,如:
> db.test.ensureIndex({"comments.date":1})
对于上面创建的索引,MongoDB都会根据索引的keyname和索引方向为新创建的索引自动分配一个索引名,下面的命令可以在创建索引时为其指定索引名,如:
> db.test.ensureIndex({"username":1},{"name":"testindex"})
随着集合的增长,需要针对查询中大量的排序做索引。如果没有对索引的键调用sort,MongoDB需要将所有数据提取到内存并排序。因此在做无索引排序时,如果数据量过大以致无法在内存中进行排序,此时MongoDB将会报错。
二、唯一索引:
在缺省情况下创建的索引均不是唯一索引。下面的示例将创建唯一索引,如:
> db.test.ensureIndex({"userid":1},{"unique":true})
如果再次插入userid重复的文档时,MongoDB将报错,以提示插入重复键,如:
> db.test.insert({"userid":5})
> db.test.insert({"userid":5})
E11000 duplicate key error index: test.test.$userid_1 dup key: { : 5.0 }
如果插入的文档中不包含userid键,那么该文档中该键的值为null,如果多次插入类似的文档,MongoDB将会报出同样的错误,如:
> db.test.insert({"userid1":5})
> db.test.insert({"userid1":5})
E11000 duplicate key error index: test.test.$userid_1 dup key: { : null }
如果在创建唯一索引时已经存在了重复项,我们可以通过下面的命令帮助我们在创建唯一索引时消除重复文档,仅保留发现的第一个文档,如:
--先删除刚刚创建的唯一索引。
> db.test.dropIndex({"userid":1})
--插入测试数据,以保证集合中有重复键存在。
> db.test.remove()
> db.test.insert({"userid":5})
> db.test.insert({"userid":5})
--创建唯一索引,并消除重复数据。
> db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true})
--查询结果确认,重复的键确实在创建索引时已经被删除。
> db.test.find()
{ "_id" : ObjectId("4fe823c180144abd15acd52e"), "userid" : 5 }
我们同样可以创建复合唯一索引,即保证复合键值唯一即可。如:
> db.test.ensureIndex({"userid":1,"age":1},{"unique":true})
三、使用explain:
explain是非常有用的工具,会帮助你获得查询方面诸多有用的信息。只要对游标调用该方法,就可以得到查询细节。explain会返回一个文档,而不是游标本身。如:
> db.test.find().explain()
{
"cursor" : "BasicCursor",
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 1,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
explain会返回查询使用的索引情况,耗时和扫描文档数的统计信息。
"cursor":"BasicCursor"表示没有使用索引。
"nscanned":1 表示查询了多少个文档。
"n":1 表示返回的文档数量。
"millis":0 表示整个查询的耗时。
四、索引管理:
system.indexes集合中包含了每个索引的详细信息,因此可以通过下面的命令查询已经存在的索引,如:
> db.system.indexes.find()
如果在为已有数据的文档创建索引时,可以执行下面的命令,以使MongoDB在后台创建索引,这样的创建时就不会阻塞其他操作。但是相比而言,以阻塞方式创建索引,会使整个创建过程效率更高,但是在创建时MongoDB将无法接收其他的操作。
> db.test.ensureIndex({"username":1},{"background":true})
相关推荐
一、MongoDB基础知识 MongoDB以JSON(JavaScript Object Notation)格式存储数据,这种格式灵活且易于理解和处理。数据以文档的形式存储,每个文档都是一组键值对,类似于JavaScript的对象。MongoDB支持丰富的查询...
你现在已经具备了运行、管理MongoDB数据库的基础知识,可以进一步探索复制集、分片、索引、聚合等功能,以满足更复杂的应用场景。同时,作为运维人员,了解数据库性能监控、备份恢复以及安全性策略也是必不可少的...
MongoDB在RHEL上运行可以受益于其成熟的系统管理和安全特性,为生产环境提供稳定的运行基础。 - RHEL 7.2是该系列的一个版本,它支持更新的技术如KVM虚拟化和OpenSSL 1.0.2,同时也包括对Docker等容器技术的支持,...
9. **云服务**:MongoDB还提供了MongoDB Atlas,一个完全托管的云数据库服务,用户无需关心基础设施维护。 在使用MongoDB时,开发者需要了解如何配置数据库、创建集合、插入和查询文档,以及如何进行备份和恢复操作...
1. 支持最新的 MongoDB 特性:这个版本的 Mongoose 可能已经更新,以便与 MongoDB 4.0.9 版本兼容,包括事务处理、聚合管道增强、新的索引类型等。 2. 查询优化:Mongoose 提供了强大的查询构造器,能够编写复杂的...
2. **查询性能**:MongoDB支持丰富的查询语法,包括聚合框架、地理空间索引、正则表达式匹配等。3.4.6版本进一步提升了查询性能,特别是在大规模数据集上的复杂查询,通过查询优化器进行更智能的计划选择。 3. **...
9. **安全性**:MongoDB 3.6引入了X509认证、角色基础的访问控制(RBAC)和加密功能,增强了数据的安全性和合规性。 10. **性能优化**:MongoDB支持索引、聚合框架和查询优化器,能有效提高查询速度。此外,其内置...
8. **性能提升**:MongoDB 3.0.4 包括一系列性能改进,如更快的索引构建、优化的内存管理以及更高效的磁盘I/O。 9. **管理工具**:MongoDB 提供了诸如`mongod`, `mongos`, `mongo` shell等工具,方便用户进行数据库...
了解这些基础后,你可以进一步探索更多高级特性,如索引、副本集、分片等,以便在实际项目中更高效地利用MongoDB。记住,实践是学习的最佳途径,动手尝试这些示例,结合MongoDB_Demo中的代码,你会更快掌握MongoDB与...
1. MongoDBTemplate:是 Spring Data MongoDB 提供的基础访问层,用于执行各种数据库操作,如插入、查询、更新和删除。 2. Repository 接口:通过继承 MongoRepository 接口,可以定义基本的 CRUD 方法,甚至自定义...
MongoDB是一款开源、分布式、高性能的文档型数据库,...通过这些知识的学习,你可以全面掌握MongoDB的基础操作,并为更深入的开发工作打下坚实基础。同时,对比最新的MongoDB版本,可以了解到数据库技术的发展和改进。
这个资料包包含了“mongodb_base.pdf”和“mongodb_advance.pdf”两个文件,分别涵盖了MongoDB的基础知识和高级知识。 首先,让我们从基础开始。MongoDB的基础知识主要包括以下几个方面: 1. 数据模型:MongoDB...
综上所述,《mongodb-docs-2011-01-29_mongodb最新用户手册》是一份详尽的手册,旨在为用户提供全面的技术支持和指导,覆盖了从基础知识到高级应用的各个方面。无论是初学者还是经验丰富的开发者,都可以从中获得有...
该项目包含了多个示例和练习,涵盖了 MongoDB 的基本概念、安装和配置、数据模型、CRUD 操作、索引、聚合、性能优化等核心内容。通过逐步讲解和实战练习,项目帮助用户掌握 MongoDB 的基本使用方法和最佳实践,并为...
在详细解释这个软件包之前,我们先来理解ODBC和MongoDB的基础知识: 1. **ODBC**:ODBC是应用程序和数据库之间的桥梁,通过ODBC驱动程序,应用程序可以与任何支持ODBC的数据库进行交互,而无需关心数据库的具体实现...
社区服务器版(Community Server)是MongoDB的基础版本,免费提供给开发者和小型团队使用。标题中的"mongodb-windows-x86-64-6.0.2.zip"表明这是MongoDB 6.0.2版本的64位Windows安装包。 MongoDB的特点在于其文档型...
8. **索引系统**:MongoDB支持多种类型的索引,包括单字段、复合、地理空间等,源码中会包含索引的创建、维护和查询优化。 9. **安全与认证**:MongoDB支持SSL加密和SCRAM-SHA-1、x509等多种认证机制,源码中涉及...
MongoDB Java 基础知识点 MongoDB 是一个基于分布式文件存储的数据库开源项目,旨在为 WEB 应用提供可靠的高性能数据存储解决方案。MongoDB 的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: ...
MongoDB 是一款强大的开源数据库系统,专为现代应用程序设计,以分布式文件存储为基础。这个“mongodb-win32-3.0.7”压缩包显然包含了MongoDB 3.0.7版本的Windows版安装文件,这是一款适用于Windows操作系统的数据库...
1. **MongoDB基础**: MongoDB是一种文档型数据库,它使用JSON-like文档作为数据存储格式,这使得数据结构灵活且易于理解和查询。它的数据模型支持动态schema,允许在一个集合中存储不同结构的文档,非常适合快速...