`
Mootools
  • 浏览: 44714 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

MongoDB索引管理

阅读更多

 

本文内容源自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

 

 

1
0
分享到:
评论

相关推荐

    MongoDB索引管理.pdf

    MongoDB索引管理.pdf 学习资料 复习资料 教学资源

    MongoDB索引管理与高级索引.pdf

    MongoDB索引管理与高级索引.pdf 学习资料 复习资料 教学资源

    关于MongoDB索引管理-索引的创建、查看、删除操作详解

    本文讲述了关于MongoDB索引管理包括索引的创建、查看索引、删除索引各方面的命令及使用方法

    MongoDB索引优化与管理-刘诚杰 天痕

    MongoDB索引优化与管理-刘诚杰 天痕,介绍 1. 索引概念 2. 索引优化 3. 执行计划 4. 索引管理

    深入解析MongoDB聚合与索引:提升数据库效能的关键策略

    同时,深入探讨MongoDB索引的类型(如单键索引、复合索引、多键索引等),并分析索引的创建、管理和优化策略。此外,文章还介绍了索引对查询性能的影响,包括如何通过explain()方法分析查询和索引效率,以及覆盖查询...

    MongoDB集群管理工具mongo3.zip

    mongo 是一款超酷的 MongoDB 集群管理...主要特性:非常容易管理你的 MongoDB 集群信息可以获取你配置的实时快照信息深入集群,数据库,集合和索引可以从单个 Web 界面管理所有的 MongoDB 文档 标签:mongo3

    mongodb数据库管理工具

    mongodb数据库管理工具,可以查看,删除,建立索引等

    MongoDB入门到云上开发视频.zip

    网盘文件永久链接 目录 课时1:MongoDB数据库入门.mp4 课时2:MongoDB数据数据查询与分析.mp4 课时3:MongoDB数据库核心知识.mp4 ...课时11:MongoDB索引原理及使用.mp4 课时12:MongoDB Sharding原理与使用.mp4

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    9.4 索引管理 9.5 本章小结 第10章 性能优化 10.1 优化方案 10.1.1 优化方案1:创建索引 10.1.2 优化方案2:限定返回结果条数 10.1.3 优化方案3:只查询使用到的字段,而不查询所有字段 10.1.4 ...

    MongoDB常用语法/Mongodb的基本使用

    MongoDB的基本常用语法:1、创建、查询数据库 ...9、Mongodb 中索引 1、为name创建索引 2、多列索引 3、子文档索引 4、唯一索引 5、查看索引 6、删除索引 删除单个索引 删除所有索引 7、重建索引 8、索引使用注意事项

    真实可用的mongodb下周地址.txt

    视频目录: 01-mongodb文档型数据库特点介绍 01-NoSQL简介 ...08-用户管理 09-mongoDB备份与恢复 09-安全和认证 10-replication复制集 10-主从复制 11-shard分片 11-分片 12-使用java操作mongodb

    MongoDB权威指南 中文第2版-01卷

    与传统的关系型数据库不同,MongoDB是一种...五部分阐述创建索引、移动和压缩数据等管理任务,以及MongoDB的持久数据存储。最后一部分集中说明服务器管理。 《MongoDB权威指南(第2版)》适合数据库开发和管理人员阅读。

    RockMongo MongoDB数据库管理工具 v1.0.8.rar

    RockMongo 是一个PHP5写的最好用的MongoDB管理工具。 主要特征: 使用宽松的New BSD License协议 速度快,安装简单 支持多语言(目前提供中文、英文、日文) 系统 可以配置多个主机,每个主机可以有多个管理员 需要...

    RockMongo MongoDB数据库管理工具 v1.1.2.rar

    RockMongo是一个PHP5写的MongoDB管理工具。 主要特征: 使用宽松的New BSD License协议 速度快,安装简单 支持多语言(目前提供中文、英文、日文、巴西葡萄牙语、法语、德语、俄语、意大利语) 系统 ...

    深入云计算 MongoDB管理与开发实战详解pdf.part2

    9.4 索引管理 9.5 本章小结 第10章 性能优化 10.1 优化方案 10.1.1 优化方案1:创建索引 10.1.2 优化方案2:限定返回结果条数 10.1.3 优化方案3:只查询使用到的字段,而不查询所有字段 10.1.4 ...

    2020年最新MongoDB 4.0专讲从入门到精通视频教程.txt

    day6:MongoDB实例搭建仓位管理API day7:数据模型优化及设计 day8:复制集介绍及演练 day9:海量数据分片 day10:数据库认证与授权介绍及演练 day11:MongoDB数据库导入导出与监控 day12:MongDB数据库常见故障及解决方案 ...

    Mongodb使用和部署ppt

    什么是Mongodb Mongodb的优势 CRUD 索引 Mongodb管理 安装部署

    RockMongo MongoDB管理工具PHP版 v1.1.2

    摘要:PHP源码,数据管理,MongoDB,RockMongo RockMongo是一款使用PHP5编写的MongoDB数据库在线管理工具,它使用宽松的New BSD License协议,速度快,安装简单,可以配置多个主机,每个主机可以有多个管理员,支持...

    robomongo mongodb可视化工具

    mongodb 可视化工具,64位 一个MongoDB管理工具,连接数据库后可以管理 MongoDB服务,数据库,集合,文档,索引等等。

Global site tag (gtag.js) - Google Analytics