• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >MongoDB > MongoDB性能优化及监控

MongoDB性能优化及监控

作者:永志 字体:[增加 减小] 来源:互联网 时间:2017-05-11

永志通过本文主要向大家介绍了mongodb 性能优化,mongodb 性能,mongodb 性能测试,mongodb 插入性能,mongodb 优化等相关知识,希望本文的分享对您有所帮助

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

一、索引

MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样。其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇。

1.基础索引

在字段age 上创建索引,1(升序);-1(降序):

db.users.ensureIndex({age:1}) 
</div>

_id 是创建表的时候自动创建的索引,此索引是不能够删除的。当系统已有大量数据时,创建索引就是个非常耗时的活,我们可以在后台执行,只需指定“backgroud:true”即可。

db.t3.ensureIndex({age:1} , {backgroud:true}) 
</div>

2.文档索引

索引可以任何类型的字段,甚至文档:

db.factories.insert( { name: "wwl", addr: { city: "Beijing", state: "BJ" } } );
//在addr 列上创建索引
db.factories.ensureIndex( { addr : 1 } );
//下面这个查询将会用到我们刚刚建立的索引
db.factories.find( { addr: { city: "Beijing", state: "BJ" } } );
//但是下面这个查询将不会用到索引,因为查询的顺序跟索引建立的顺序不一样
db.factories.find( { addr: { state: "BJ" , city: "Beijing"} } ); 
</div>

3. 组合索引

跟其它数据库产品一样,MongoDB 也是有组合索引的,下面我们将在addr.city 和addr.state上建立组合索引。当创建组合索引时,字段后面的1 表示升序,-1 表示降序,是用1 还是用-1 主要是跟排序的时候或指定范围内查询 的时候有关的。

db.factories.ensureIndex( { "addr.city" : 1, "addr.state" : 1 } );
// 下面的查询都用到了这个索引
db.factories.find( { "addr.city" : "Beijing", "addr.state" : "BJ" } );
db.factories.find( { "addr.city" : "Beijing" } );
db.factories.find().sort( { "addr.city" : 1, "addr.state" : 1 } );
db.factories.find().sort( { "addr.city" : 1 } ) 
</div>

4. 唯一索引

只需在ensureIndex 命令中指定”unique:true”即可创建唯一索引。例如,往表t4 中插入2 条记录:

db.t4.ensureIndex({firstname: 1, lastname: 1}, {unique: true}); 
</div>

5.强制使用索引

hint 命令可以强制使用某个索引。

db.t5.find({age:{$lt:30}}).hint({name:1, age:1}).explain() 
</div>

6.删除索引

//删除t3 表中的所有索引
db.t3.dropIndexes()
//删除t4 表中的firstname 索引
db.t4.dropIndex({firstname: 1}) 
</div>

二、explain执行计划

MongoDB 提供了一个 explain 命令让我们获知系统如何处理查询请求。利用 explain 命令,我们可以很好地观察系统如何使用索引来加快检索,同时可以针对性优化索引。

db.t5.ensureIndex({name:1})
db.t5.ensureIndex({age:1})
db.t5.find({age:{$gt:45}}, {name:1}).explain()
{
"cursor" : "BtreeCursor age_1",
"nscanned" : 0,
"nscannedObjects" : 0,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"age" : [
[45,1.7976931348623157e+308]
]
}
} 


</div>

字段说明:

•cursor: 返回游标类型(BasicCursor 或 BtreeCursor)
•nscanned: 被扫描的文档数量
•n: 返回的文档数量
•millis: 耗时(毫秒)
•indexBounds: 所使用的索引

三、优化器profile

在MySQL 中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB 中是否有类似的功能呢?答案是肯定的,那就是MongoDB Database Profiler。

1.开启profiling功能

有两种方式可以控制 Profiling 的开关和级别,第一种是直接在启动参数里直接进行设置。启动MongoDB 时加上–profile=级别 即可。也可以在客户端调用db.setProfilingLevel(级别) 命令来实时配置,Profiler 信息保存在system.profile 中。我们可以通过db.getProfilingLevel()命令来获取当前的Profile 级别,类似如下操作:

db.setProfilingLevel(2); 

</div>

上面profile 的级别可以取0,1,2 三个值,他们表示的意义如下:

1.0 – 不开启
2.1 – 记录慢命令 (默认为>100ms)
3.2 – 记录所有命令

Profile 记录在级别1 时会记录慢命令,那么这个慢的定义是什么?上面我们说到其默认为100ms,当然有默认就有设置,其设置方法和级别一样有两种,一种是通过添加 –slowms 启动参数配置。第二种是调用db.setProfilingLevel 时加上第二个参数:

db.setProfilingLevel( level , slowms )
db.setProfilingLevel( 1 , 10 ); 
</div>

2.查询 Profiling 记录

与MySQL 的慢查询日志不同,MongoDB Profile 记录是直接存在系统db 里的,记录位置system.profile ,所以,我们只要查询这个Collection 的记录就可以获取到我们的 Profile 记录了。列出执行时间长于某一限度(5ms)的 Profile 记录:

db.system.profile.find( { millis : { $gt : 5 } } ) 
</div>

MongoDB Shell 还提供了一个比较简洁的命令show profile,可列出最近5 条执行时间超过1ms 的 Profile 记录。

四、常用性能优化方案

1.创建索引

2.限定返回结果数

3.只查询使用到的字段

4.采用capped collection

5.采用Server Side Code Execution

6.使用Hint,强制使用索引

7.采用Profiling

五、性能监控工具

1. mongosniff

此工具可以从底层监控到底有哪些命令发送给了MongoDB 去执行,从中就可以进行分析:以root 身份执行:

$./mongosniff --source NET lo 

</div>

然后其会监控位到本地以localhost 监听默认27017 端口的MongoDB 的所有包请求。

2.Mongostat

此工具可以快速的查看某组运行中的MongoDB 实例的统计信息 字段说明:
•insert: 每秒插入量
•query: 每秒查询量
•update: 每秒更新量
•delete: 每秒删除量
•locked: 锁定量
•qr | qw: 客户端查询排队长度(读|写)
•ar | aw: 活跃客户端量(读|写)
•conn: 连接数
•time: 当前时间

它每秒钟刷新一次状态值,提供良好的可读性,通过这些参数可以观察到一个整体的性能情况。

3. db.serverStatus

这个命令是最常用也是最基础的查看实例运行状态的命令之一。

4.db.stats

下面给大家介绍下mongodb的监控

mongodb可以通过profile来监控数据,进行优化。

查看当前是否开启profile功能用命令

db.getProfilingLevel() 返回level等级,值为0|1|2,分别代表意思:0代表关闭,1代表记录慢命令,2代表全部开始profile功能为

db.setProfilingLevel(level); #level等级,值同上level为1的时候,慢命令默认值为100ms,更改为db.setProfilingLevel(level,slowms)如db.setProfilingLevel(1,50)这样就更改为50毫秒通过db.system.profile.find() 查看当前的监控日志。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 记一次MongoDB性能问题(从MySQL迁移到MongoDB)
  • 浅析Mongodb性能优化的相关问题
  • MongoDB查询性能优化验证及验证
  • MongoDB性能优化及监控
  • 如何对 MongoDB 进行性能优化(五个简单步骤)

相关文章

  • 2017-05-11mongodb 随机获取一条记录的方法
  • 2017-05-11Windows下MongoDB配置用户权限实例
  • 2017-05-11详解MongoDB管理命令
  • 2017-05-11MongoDB日志文件过大的解决方法
  • 2017-05-11教大家8天学通MongoDB——第一天 基础入门篇
  • 2017-05-11MongoDB aggregate 运用篇个人总结
  • 2017-05-11mac下使用brew 安装mongodb的方法教程
  • 2017-05-11浅谈MongoDB的备份方式
  • 2017-05-11CentOS 7下用yum快速安装MongoDB的方法教程
  • 2017-05-11MongoDB 使用Skip和limit分页

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • MongoDB备份、还原、导出、导入、克隆操作示例
    • MongoDB在不同主机间复制数据库和集合的教程
    • MongoDB学习笔记之MapReduce使用示例
    • MongoDB的Master-Slave主从模式配置及主从复制要点解析
    • Mongodb增加、移除Shard Server实例
    • MongoDB的PHP驱动方法与技巧
    • MongoDB远程访问配置步骤详解
    • 阿里云CentOS7安装Mongodb教程
    • MongoDB快速入门笔记(一)之windows下安装MongoDB方法
    • mongoDB 实现主从读写分离实现的实例代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有