本文内容源自Kyle Banker 的 MongoDB In Action一书。主要描述了MongoDB索引相关的一些基础知识和使用技巧。
索引类型
虽然MongoDB的索引在存储结构上都是一样的,但是根据不同的应用层需求,还是分成了唯一索引(unique)、稀疏索引(sparse)、多值索引(multikey)等几种类型。
唯一索引
唯一索引在创建时加上unique:true 的选项即可,创建命令如下:
db.users.ensureIndex({username: 1}, {unique: true})
上面的唯一索引创建后,如果insert一条username已经存在的数据,则会报如下的错误:
E11000 duplicate key error index: gardening.users.$username_1 dup key: { : "kbanker" }
如果你在一个已有数据的collection上创建唯一索引,若唯一索引对应的字段原来就有重复的数据项,那么创建会失败,我们需要加上一个dropDups的选项来强制将重复的项删除掉,命令如下例:
db.users.ensureIndex({username: 1}, {unique: true, dropDups: true})
松散索引
如果你的数据中一些行中没有某个字段或字段值为null,那么如果在这个字段上建立普通索引,那么无此字段或值null的行也会参与到索引结构中,占用相应的空间。如果我们不希望这些值为空的行参与到我们的索引中,这时候可以采用松散索引,松散索引只会让指定字段不为空的行参与到索引创建中来。创建一个松散索引可以用下面的命令:
db.reviews.ensureIndex({user_id: 1}, {sparse: true})
多值索引
MongoDB可以对一个array类型创建索引,比如像下面的结构,MongoDB可以在tags字段上创建索引:
{ name: "Wheelbarrow",
tags: ["tools", "gardening", "soil"]
}
在生成索引时,会为tags中的三个值分别生成三个索引元素,索引中tools,gardening,soil三个值都会指向这同一行数据。相当于分裂成了三个独立的索引项。
索引管理
索引的创建和删除
创建和删除索引的方法有很多种,下面两个是比较原始的方法,通过对system.indexes这个collection进行相应的写操作来完成索引的创建:
spec = {ns: "green.users", key: {‘addresses.zip’: 1}, name: ‘zip’}
db.system.indexes.insert(spec, true)
上面命令往system.indexes中写入一条记录来创建索引,这条记录包含了要在上面创建索引的collection的名字空间,索引的信息,以及索引的名称。
创建完成后,我们可以通过下面命令找到我们创建的索引:
db.system.indexes.find()
{ "_id" : ObjectId("4d2205c4051f853d46447e95"), "ns" : "green.users",
"key" : { "addresses.zip" : 1 }, "name" : "zip", "v" : 0 }
要删除一个已创建的索引,我们可以使用下面的命令来实现:
use green
db.runCommand({deleteIndexes: "users", index: "zip"})
创建索引命令
实际上创建索引还有更方便的命令,那就是ensureIndex,比如我们创建一个open和close两个字段的联合索引,就可以用下面的命令:
db.values.ensureIndex({open: 1, close: 1})
这个命令会触发索引创建的两个过程,一个是将相应的字段排序,因为索引是按B+树来组织的,要构建树,将数据进行排序后能够提高插入B+树的效率(第二个过程的效率),在日志中,你能看到和下面类似的输出:
Tue Jan 4 09:58:17 [conn1] building new index on { open: 1.0, close: 1.0 } for stocks.values
1000000/4308303 23%
2000000/4308303 46%
3000000/4308303 69%
4000000/4308303 92%
Tue Jan 4 09:59:13 [conn1] external sort used : 5 files in 55 secs
第二个过程是将排序好的数据插入到索引结构中,构成可用的索引:
1200300/4308303 27%
2227900/4308303 51%
2837100/4308303 65%
3278100/4308303 76%
3783300/4308303 87%
4075500/4308303 94%
Tue Jan 4 10:00:16 [conn1] done building bottom layer, going to commit
Tue Jan 4 10:00:16 [conn1] done for 4308303 records 118.942secs
Tue Jan 4 10:00:16 [conn1] insert stocks.system.indexes 118942ms
除了日志中的输出外,你还可以通过在终端执行currentOp命令来获取当前操作线程的相关信息,如下例:
> db.currentOp()
{
"inprog" : [
{
"opid" : 58,
"active" : true,
"lockType" : "write",
"waitingForLock" : false,
"secs_running" : 55,
"op" : "insert",
"ns" : "stocks.system.indexes",
"query" : {
},
"client" : "127.0.0.1:53421",
"desc" : "conn",
"msg" : "index: (1/3) external sort 3999999/4308303 92%"
}
]
}
最后一部分就是一个索引构建过程,目前正在执行排序过程,执行到92%。
在后台创建索引
创建索引会对数据库添加写锁,如果数据集比如大,会将线上读写数据库的操作挂起,以等待索引创建结束。这影响了数据库的正常服务,我们可以通过在创建索引时加background:true 的选项,让创建工作在后台执行,这时候创建索引还是需要加写锁,但是这个写锁不会直接独占到索引创建完成,而是会暂停为其它读写操作让路,不至于造成严重的性能影响。具体方法:
db.values.ensureIndex({open: 1, close: 1}, {background: true})
离线创建索引
无论如何,索引的创建都会给数据库造成一定的压力,从而影响线上服务。如果希望创建索引的过程完全不影响线上服务,我们可以通过将replica sets中的节点先从集群中剥离,在这个节点上添加相应的索引,等索引添加完毕后再将其添加到replica sets中。这只需要保证一个条件,就是创建索引的时间不能长于oplog能够保存日志的时间,否则创建完后节点再上线发现再也无法追上primary了,这时会进行resync操作。
索引备份
我们知道,无论是使用mongodump还是mongoexport命令,都只是对数据进行备份,无法备份索引。我们在恢复的时候,还是需要等待漫长的索引创建过程。所以,如果你希望备份的时候带上索引,那么最好采用备份数据文件的方式。
索引压缩
索引在使用一段时间后,经历增删改等操作,会变得比较松散,从而战用不必要的空间,我们可以通过reindex命令,重新组织索引,让索引的空间占用变得更小。
英文原文:http://www.nosqlwiki.com
分享到:
相关推荐
在 MongoDB 中,索引管理是优化查询性能的关键环节。以下是对 MongoDB 索引管理的深入探讨: 1. **查看索引** MongoDB 提供了多种方法来查看已创建的索引。通过 `getIndexes()` 方法,你可以获取到指定集合上的...
本篇文章将详细探讨MongoDB中的索引管理以及高级索引概念。 1. **查看索引** MongoDB 提供了两种方法来查看集合上的索引。`db.COLLECTION_NAME.getIndexes()` 方法返回集合上所有索引的详细信息,而 `db.system....
在MongoDB中,索引的管理包括创建、查看和删除等操作,这些操作对于优化数据库性能至关重要。 1. **创建/重建索引** - **创建索引**:MongoDB 使用 `ensureIndex()` 方法创建新索引。例如,`db.COLLECTION_NAME....
MongoDB是一种流行的NoSQL数据库,它的索引机制与传统的关系型数据库类似,旨在提升查询和排序的速度。在MongoDB中,索引对于优化查询性能至关重要,尤其在处理大量数据时。下面将详细介绍MongoDB中不同类型的索引...
#### 五、MongoDB索引管理 **1.7 MongoDB索引原理** - **索引类型**: MongoDB支持多种索引类型,包括B-tree索引、唯一索引、复合索引等。 - **索引结构**: 索引使用B-tree结构,便于快速查找。 **1.7.1 MongoDB...
- **索引管理**:维护索引的健康状况,优化查询性能。 #### MongoDB复制 - **MongoDB中的复制**:通过副本集实现数据冗余和负载均衡。 - **复制原理**:主节点负责接收写入操作,其他节点作为副本进行数据同步。 - ...
- 图形化管理:提供了可视化图表,如数据大小、索引性能等。 - 脚本支持:支持JavaScript脚本编写,便于自动化任务。 - 多语言:支持多种语言界面,方便全球用户使用。 2. **RockMongo** RockMongo是另一个开源...
索引是数据库管理系统中的关键元素,它们能够显著提升查询性能,特别是在大型数据集上。在 MongoDB 中,索引的创建对于优化查询效率至关重要。以下是关于MongoDB创建索引的一些详细知识点: 1. **创建索引的方法**...
MongoDB索引是数据库性能优化的关键工具,它们类似于书籍的目录,可以帮助快速定位到所需的数据,从而大大提高查询效率。在没有索引的情况下,MongoDB必须遍历整个集合来找到匹配的文档,这在数据量大的时候会导致...
#### 五、MongoDB索引管理 - **创建索引**:通过`createIndex()`方法创建索引,可以提高查询效率。 - **唯一索引**:确保索引字段的值是唯一的。 - **复合索引**:在一个索引中包含多个字段。 - **全文搜索索引**:...
Linux、数据库、Redis、MongoDB 统一管理平台 一、Linux 统一管理平台 Linux 统一管理平台是基于 DDD(领域驱动设计)分层架构实现的,提供了 ssh 终端、文件查看和操作、脚本管理执行、进程操作、运行状态查看等...
总结来说,命名索引提供了更好的索引管理,让你可以为每个索引赋予有意义的名称。而唯一索引则确保了数据的唯一性,防止插入重复记录,这对于保持数据的完整性和一致性非常重要。在 MongoDB 中正确地使用这两种索引...
2. **易用性**:它提供了一个简洁的图形用户界面(GUI),用户可以通过浏览器访问并执行常见的数据库操作,如创建、查看、更新和删除数据,以及管理集合、索引和用户权限。 3. **安全连接**:RockMongo支持安全的SSL...
MongoDB的一个核心功能是其索引机制,其中包括了时间对数据失效进行管理的TTL(Time To Live)索引。TTL索引能够让集合中的数据拥有一个固定的生命周期,当数据超过这个生命周期之后,相关文档会自动被删除,这对于...
网盘文件永久链接 目录 课时1:MongoDB数据库入门.mp4 课时2:MongoDB数据数据查询与分析.mp4 课时3:MongoDB数据库核心知识.mp4 ...课时11:MongoDB索引原理及使用.mp4 课时12:MongoDB Sharding原理与使用.mp4
MongoDB 是一种流行的开源文档数据库系统,以其灵活性和高性能而受到许多开发者的青睐。...在设计和管理MongoDB数据库时,应根据查询模式和数据特性,明智地创建和维护索引,以实现最佳的性能表现。
mongo 是一款超酷的 MongoDB 集群管理...主要特性:非常容易管理你的 MongoDB 集群信息可以获取你配置的实时快照信息深入集群,数据库,集合和索引可以从单个 Web 界面管理所有的 MongoDB 文档 标签:mongo3
7. 图形化索引管理:创建、修改和删除索引,提升查询速度。 8. 集群管理:对于运行在集群环境中的MongoDB,这些工具可以提供集群状态的可视化,包括分片、复制集等。 TreeDMS-2.1.3可能是该Web管理工具的一个版本...