- 浏览: 506879 次
- 性别:
- 来自: 大连->北京
文章分类
最新评论
-
春天好:
写的很不错 推荐一个免费好用的云端爬虫开发平台不需要安装环境, ...
web爬虫 -
cpu88:
网络爬虫爬来爬去,网上信息可以瞬间扩散,但是也意味着,没有人愿 ...
web爬虫 -
biaoming:
牛。。学习了。。
MongoDB 关于索引的建议 -
biaoming:
楼主用mongo好早啊。
MongoDB 优化 -
biaoming:
好教程,学习了。。。
MongoDB 优化
索引Indexes
索引常常用来大幅度的提升查询的性能。 考虑应用程序的查询种类是非常重要的事情,因此你就要定义相关的索引。
决定了之后,在MongoDB中创建索引是非常简单的。
基础索引就是collection中一个document指定一个字段值的数据结构。MongoDB查询优化器可以使用这个数据结构快速分类整理以及排序document。一般来说,索引的实现是B-TREE。
在Shell中,你可以使用ensureIndex()来创建索引,并且指定要索引一个或多个字段。
我们在j字段上创建一个索引
db.things.ensureIndex({j:1}); 如果索引不存在,ensureIndex就创建索引。 一旦索引被创建了,匹配索引字段的查询是非常快速的。 没有索引的话,MongoDB必须检查每个document要查询的字段。 db.things.find({j : 2}); // 快速,使用了索引。
db.things.find({x : 3}); // 慢- 检查所有的document,因为x没有被索引。
你可以使用db.things.getIndexes();来查看索引信息。
默认索引_id字段默认被添加了索引。这个索引也不能被删除。_id索引是唯一的。Capped Collections并不会默认创建索引。
Embedded Keys你甚至可以向embedded document的字段创建索引。例子
db.things.ensureIndex({"address.city": 1})
document做为key索引的字段可以为任意类型,包括了document类型。 db.factories.insert( { name: "xyz", metro: { city: "New York", state: "NY" } } ); db.factories.ensureIndex( { metro : 1 } ); //这个查询可以使用上面创建的索引。
db.factories.find( { metro: { city: "New York", state: "NY" } } ); //等同于
db.factories.find( { metro: { $gte : { city: "New York" } } } );
//metro内的字段顺序错误,不能应用这个索引。
db.factories.find( { metro: { state: "NY" , city: "New York" } } ); 也可以创建这个document内字段的组合索引。 db.factories.ensureIndex( { "metro.city" : 1, "metro.state" : 1 } ); //以下查询可以使用上面创建的索引。
db.factories.find( { "metro.city" : "New York", "metro.state" : "NY" } ); db.factories.find( { "metro.city" : "New York" } ); db.factories.find().sort( { "metro.city" : 1, "metro.state" : 1 } ); db.factories.find().sort( { "metro.city" : 1 } )
下面谈谈这两种方法的优劣势。 当使用整个document做为索引,顺序就默认定义了,升序。 当使用组合索引,你可以混合升序和降序的key,并且查询优化器使用该索引也需要匹配查询中的首个字段。
数组当索引的键为数组的时候,MongoDB会索引数组中每个元素。 组合索引除了支持单个字段的索引,MongoDB也支持索引多个字段。创建的索引地方法一样,都使用ensureIndex()。但是你可以指定多个字段。 db.things.ensureIndex({j:1, name:-1}); 当创建索引的时候,上面的数字1和-1代表着索引的方向。1是升序,-1为降序。如果为单个索引,顺序并无所谓。如果使用组合索引,顺序就非常重要了。
你可以在多个字段创建索引,查询可以用字段子集做为开头来匹配索引。
如果你在a,b,c上创建索引。 下列查询都可以使用这个索引。 a a,b a,b,c
Sparse Indexes稀疏索引
1.7.4的新功能。 sparse index就是在一个存在于document的字段上创建的索引。
任何document中不存在这个索引的字段,那么就不会保存在索引中。之所以叫sparse,当没有索引字段的值的时候,document也就丢失了。 Sparse indexes, 不是完整的索引,也和完整索引操作上有所不同。当使用一个sparse index排序,一些document就不会返回了。
只有存在于index中的document才会返回。
db.people.ensureIndex({title : 1}, {sparse : true})
db.people.save({name:"Jim"})
db.people.save({name:"Sarah", title:"Princess"}) db.people.find({title:{$ne:null}}).sort({title:1})
// 只返回 Sarah的文档
你可以把sparse何unique索引结合起来,来给那些没有丢失字段的document加以唯一性约束。
Unique Indexes唯一索引MongoDB支持唯一索引,保证了插入document的索引值和已存在document索引值不重复。
下面的示例就保证了不会有两个document中的firstname和lastname值相等。
db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
丢失的键
当保存一个不存在唯一索引的字段的document,那么这个字段的值默认为null。但是这种缺失索引字段的document只能插入一次了。
db.things.ensureIndex({firstname: 1}, {unique: true});
db.things.save({lastname: "Smith"});
/这个操作就会发生错误。
db.things.save({lastname: "Jones"});
重复的值一个唯一索引的值是不能重复的。
保存首个document,而要删除其他索引值和它重复的document,添加参数dropDups
db.things.ensureIndex({firstname : 1}, {unique : true, dropDups : true})
在后台创建索引创建一个索引,默认的情况会阻塞其他数据库的操作。在1.3.2+版本,支持后台创建索引background index build option .
删除索引删除指定collection的索引语句为 db.collection.dropIndexes(); 删除一个单独的索引 db.collection.dropIndex({x: 1, y: -1}) 直接运行一个命令 // 注意:1.3.2之前 命令是"deleteIndexes", 而不是 "dropIndexes"
// 从foo collection中删除 {y:1}索引
db.runCommand({dropIndexes:'foo', index : {y:1}}) // 删除所有索引
db.runCommand({dropIndexes:'foo', index : '*'}) 重新索引reIndex会重新创建索引 db.myCollection.reIndex() // 等同于:
db.runCommand( { reIndex : 'myCollection' } ) 一般来说用不上。如果collection大小增长太快或者索引占用空间看起来很大,就可以使用reIndex。 修复数据库会重新创建索引。 额外要注意的
索引的性能索引主要用于查询,也包括了排序,非常的快。通过索引查找的document更新也是非常快的。
然而,要记住的是,索引会降低插入和删除的性能。原因就是数据的写入也要同时也如索引。
但是索引对于那些读取多于写入的collection尤为有用。
对于写入数据频率高的collection,索引会影响性能。
大部分collection都是读取率高,所以索引对于大部分场景还是非常不错的。
不适用索引来进行排序如果排序的数据非常少(小于4M),那就不需要索引。一般要limit和sort一起使用。Geospatial地理空间 |
发表评论
-
MongoDB 优化
2011-04-12 15:44 10298优化一个简单的例子 这部分主要讲解如何优化M ... -
MongoDB Schema Design 数据库设计
2011-04-11 19:26 13239介绍 使用MongoDB设计数据库,就不要 ... -
MongoDB 合法的键的名称Legal Key Names
2011-04-11 17:05 1943合法的键的名称Legal Key Names ... -
MongoDB Inserting 插入数据
2011-04-11 16:51 4857MongoDB Inserting 插入数据 ... -
MongoDB 关于索引的建议
2011-04-11 15:20 10328MongoDB 关于索引的建议 ... -
MongoDB Multikeys(多个键)
2011-04-11 11:57 3650Multikeys(多个键) Mong ... -
MongoDB 后台中操作索引
2011-04-11 11:24 2569MongoDB 后台中操作索引 ... -
使用 Multikeys 模拟大数量的索引
2011-04-11 10:26 1587使用 Multikeys 模拟大数量的索引 ... -
使用MongoDB GridFS的场景
2011-04-09 14:19 2794使用MongoDB GridFS的场景 ... -
MongoDB GridFS
2011-04-07 14:34 2491GridFS GridFS是Mong ... -
MongoDB 使用大数据量的collection
2011-04-07 13:07 4829使用大数据量的collection. 在 ... -
MongoDB 聚集 Collections
2011-04-06 16:56 1717聚集Collections MongoD ... -
MongoDB 验证命令(Validate Command)
2011-04-06 15:12 1990验证命令(Validate Command) 使 ... -
MongoDB 查看和终止当前操作(Viewing and Terminating Current Operation)
2011-04-06 15:00 3839查看当前进程的操作 > db. ... -
MongoDB Last Error 命令
2011-04-06 14:38 3012Last Error Commands ... -
MongoDB 索引的命令 Index-Related Commands
2011-04-03 13:25 1413索引的 命令 创建索引 ... -
MongoDB 同步命令 fsync Command
2011-04-02 13:53 4371fsync Command ... -
MongoDB 复制数据库 Clone Database
2011-04-02 10:33 11515复制数据库Clone Database ... -
MongoDB里的database
2011-04-01 23:34 1032数据库 每个MongoDB ... -
MongoDB的命令
2011-04-01 23:30 1146命令 介绍 Mo ...
相关推荐
- **索引键长度限制**:从 MongoDB 2.6 版本开始,如果索引字段值超出索引键长度限制,MongoDB 不会创建该索引。这防止了因过长的键值导致的资源浪费。 - **插入文档限制**:如果插入文档的索引字段值超过限制,...
在 MongoDB 中,索引管理是优化查询性能的关键环节。以下是对 MongoDB 索引管理的深入探讨: 1. **查看索引** MongoDB 提供了多种方法来查看已创建的索引。通过 `getIndexes()` 方法,你可以获取到指定集合上的...
MongoDB是一种流行的NoSQL数据库,它的索引机制与传统的关系型数据库类似,旨在提升查询和排序的速度。在MongoDB中,索引对于优化查询性能至关重要,尤其在处理大量数据时。下面将详细介绍MongoDB中不同类型的索引...
SpringBoot MongoDB 索引冲突分析及解决方法 SpringBoot MongoDB 索引冲突分析及解决方法是 SpringBoot 应用程序中 MongoDB 索引冲突的解决方法。该方法主要通过spring-data-mongo 实现基于 MongoDB 的 ORM-...
MongoDB索引是数据库性能优化的关键工具,它们类似于书籍的目录,可以帮助快速定位到所需的数据,从而大大提高查询效率。在没有索引的情况下,MongoDB必须遍历整个集合来找到匹配的文档,这在数据量大的时候会导致...
#### MongoDB索引 - **介绍**:索引能够显著提高查询性能,MongoDB支持单字段索引、复合索引、唯一索引等多种类型的索引。 - **后台创建索引**:可以在运行时创建索引,而无需停止服务。 - **索引类型**: - **单...
MongoDB 数据库索引介绍 MongoDB 数据库索引是提高查询性能和减少查询时间的重要手段。索引可以告诉 MongoDB 如何高效地检索数据,以便快速地找到所需的数据。在本文中,我们将深入探讨 MongoDB 数据库索引的基础...
MongoDB的索引是数据库性能优化的关键因素,与MySQL、Oracle等关系型数据库中的索引原理相似,但具有自身的特性和限制。MongoDB的索引建立在Collection(表)级别,采用B-树数据结构来加速查询和排序操作。 1. 默认...
本篇文章将详细探讨MongoDB中的索引管理以及高级索引概念。 1. **查看索引** MongoDB 提供了两种方法来查看集合上的索引。`db.COLLECTION_NAME.getIndexes()` 方法返回集合上所有索引的详细信息,而 `db.system....
索引是 MongoDB 中的关键概念,它们能够显著提升查询性能。本篇资料主要涵盖了 MongoDB 的索引使用和查询分析,以下是对这些知识点的详细解释: 1. **explain操作**:`explain` 是 MongoDB 提供的一个命令,用于...
在 MongoDB 中,索引的创建对于优化查询效率至关重要。以下是关于MongoDB创建索引的一些详细知识点: 1. **创建索引的方法**: MongoDB 使用 `ensureIndex()` 方法来创建索引。尽管在较新的版本中,`createIndex()...
索引是提升查询性能的关键工具,本文将详细介绍MongoDB中的索引基础知识、唯一索引、索引参数以及如何通过`explain`分析查询速度。 一、索引基础 在MongoDB中,索引是一种特殊的数据结构,它们对集合中的一列或多...
MongoDB是一个基于文档的NoSQL数据库,由C++语言编写,旨在为大量分布式数据提供高性能、高可用...6. **索引**:支持多种类型的索引,以优化查询性能。 7. **灵活的聚合框架**:MongoDB的聚合框架允许用户执行复杂的数
在MongoDB中,索引扮演着至关重要的角色,它类似于传统的关系型数据库,通过B-Tree数据结构加速数据查找和排序。 ### 一、索引简介 MongoDB 的索引可以通过`ensureIndex()`函数创建,指定一个或多个字段来提升查询...
MongoDB数据库
1. 普通索引 1. 单列索引 2. 多列索引 3. 子文档索引 2. 唯一索引 3. 稀疏索引 4. 哈希索引 5. 重建索引 6. 删除索引 7. 查看索引