- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MongoDB性能优化及监控由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案.
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.
1、索引 。
MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样。其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇.
1.基础索引 。
在字段age 上创建索引,1(升序);-1(降序):
1
|
db.users.ensureIndex({age:1})
|
_id 是创建表的时候自动创建的索引,此索引是不能够删除的。当系统已有大量数据时,创建索引就是个非常耗时的活,我们可以在后台执行,只需指定“backgroud:true”即可.
1
|
db.t3.ensureIndex({age:1} , {backgroud:
true
})
|
2.文档索引 。
索引可以任何类型的字段,甚至文档
1
2
3
4
5
6
7
|
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"
} } );
|
3. 组合索引 。
跟其它数据库产品一样,MongoDB 也是有组合索引的,下面我们将在addr.city 和addr.state上建立组合索引。当创建组合索引时,字段后面的1 表示升序,-1 表示降序,是用1 还是用-1 主要是跟排序的时候或指定范围内查询 的时候有关的.
1
2
3
4
5
6
|
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 } )
|
4. 唯一索引 。
只需在ensureIndex 命令中指定”unique:true”即可创建唯一索引。例如,往表t4 中插入2 条记录
1
|
db.t4.ensureIndex({firstname: 1, lastname: 1}, {
unique
:
true
});
|
5.强制使用索引 。
hint 命令可以强制使用某个索引.
1
|
db.t5.find({age:{$lt:30}}).hint({
name
:1, age:1}).explain()
|
6.删除索引 。
1
2
3
4
|
//删除t3 表中的所有索引
db.t3.dropIndexes()
//删除t4 表中的firstname 索引
db.t4.dropIndex({firstname: 1})
|
2、explain执行计划 。
MongoDB 提供了一个 explain 命令让我们获知系统如何处理查询请求。利用 explain 命令,我们可以很好地观察系统如何使用索引来加快检索,同时可以针对性优化索引.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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]
]
}
}
|
字段说明
•cursor: 返回游标类型(BasicCursor 或 BtreeCursor) •nscanned: 被扫描的文档数量 •n: 返回的文档数量 •millis: 耗时(毫秒) •indexBounds: 所使用的索引 。
3、优化器profile 。
在MySQL 中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB 中是否有类似的功能呢?答案是肯定的,那就是MongoDB Database Profiler.
1.开启profiling功能 。
有两种方式可以控制 Profiling 的开关和级别,第一种是直接在启动参数里直接进行设置。启动MongoDB 时加上–profile=级别 即可。也可以在客户端调用db.setProfilingLevel(级别) 命令来实时配置,Profiler 信息保存在system.profile 中。我们可以通过db.getProfilingLevel()命令来获取当前的Profile 级别,类似如下操作:
1
|
db.setProfilingLevel(2);
|
上面profile 的级别可以取0,1,2 三个值,他们表示的意义如下:
1.0 – 不开启 2.1 – 记录慢命令 (默认为>100ms) 3.2 – 记录所有命令 。
Profile 记录在级别1 时会记录慢命令,那么这个慢的定义是什么?上面我们说到其默认为100ms,当然有默认就有设置,其设置方法和级别一样有两种,一种是通过添加 –slowms 启动参数配置。第二种是调用db.setProfilingLevel 时加上第二个参数:
1
2
|
db.setProfilingLevel(
level
, slowms )
db.setProfilingLevel( 1 , 10 );
|
2.查询 Profiling 记录 。
与MySQL 的慢查询日志不同,MongoDB Profile 记录是直接存在系统db 里的,记录位置system.profile ,所以,我们只要查询这个Collection 的记录就可以获取到我们的 Profile 记录了。列出执行时间长于某一限度(5ms)的 Profile 记录:
1
|
db.system.profile.find( { millis : { $gt : 5 } } )
|
MongoDB Shell 还提供了一个比较简洁的命令show profile,可列出最近5 条执行时间超过1ms 的 Profile 记录.
4、常用性能优化方案 。
1.创建索引 。
2.限定返回结果数 。
3.只查询使用到的字段 。
4.采用capped collection 。
5.采用Server Side Code Execution 。
6.使用Hint,强制使用索引 。
7.采用Profiling 。
5、性能监控工具 。
1. mongosniff 。
此工具可以从底层监控到底有哪些命令发送给了MongoDB 去执行,从中就可以进行分析:以root 身份执行:
1
|
$./mongosniff
--source NET lo
|
然后其会监控位到本地以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() 查看当前的监控日志。 如:
1
2
3
|
> db.system.profile.find({millis:{$gt:500}})
{
"ts"
: ISODate(
"2011-07-23T02:50:13.941Z"
),
"info"
:
"query order.order reslen:11022 nscanned:672230 \nquery: { status: 1.0 } nreturned:101 bytes:11006 640ms"
,
"millis"
: 640 }
{
"ts"
: ISODate(
"2011-07-23T02:51:00.096Z"
),
"info"
:
"query order.order reslen:11146 nscanned:672302 \nquery: { status: 1.0, user.uid: { $gt: 1663199.0 } } nreturned:101 bytes:11130 647ms"
,
"millis"
: 647 }
|
这里值的含义是 。
ts:命令执行时间 info:命令的内容 query:代表查询 order.order: 代表查询的库与集合 reslen:返回的结果集大小,byte数 nscanned:扫描记录数量 nquery:后面是查询条件 nreturned:返回记录数及用时 millis:所花时间 。
如果发现时间比较长,那么就需要作优化.
比如nscanned数很大,或者接近记录总数,那么可能没有用到索引查询。 reslen很大,有可能返回没必要的字段。 nreturned很大,那么有可能查询的时候没有加限制.
mongo可以通过db.serverStatus()查看mongod的运行状态 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
> db.serverStatus()
{
"host"
:
"baobao-laptop"
,#主机名
"version"
:
"1.8.2"
,#版本号
"process"
:
"mongod"
,#进程名
"uptime"
: 15549,#运行时间
"uptimeEstimate"
: 15351,
"localTime"
: ISODate(
"2011-07-23T06:07:31.220Z"
),当前时间
"globalLock"
: {
"totalTime"
: 15548525410,#总运行时间(ns)
"lockTime"
: 89206633, #总的锁时间(ns)
"ratio"
: 0.005737305027178137,#锁比值
"currentQueue"
: {
"total"
: 0,#当前需要执行的队列
"readers"
: 0,#读队列
"writers"
: 0#写队列
},
"activeClients"
: {
"total"
: 0,#当前客户端执行的链接数
"readers"
: 0,#读链接数
"writers"
: 0#写链接数
}
},
"mem"
: {#内存情况
"bits"
: 32,#32位系统
"resident"
: 337,#占有物理内存数
"virtual"
: 599,#占有虚拟内存
"supported"
:
true
,#是否支持扩展内存
"mapped"
: 512
},
"connections"
: {
"current"
: 2,#当前链接数
"available"
: 817#可用链接数
},
"extra_info"
: {
"note"
:
"fields vary by platform"
,
"heap_usage_bytes"
: 159008,#堆使用情况字节
"page_faults"
: 907 #页面故作
},
"indexCounters"
: {
"btree"
: {
"accesses"
: 59963, #索引被访问数
"hits"
: 59963, #所以命中数
"misses"
: 0,#索引偏差数
"resets"
: 0,#复位数
"missRatio"
: 0#未命中率
}
},
"backgroundFlushing"
: {
"flushes"
: 259, #刷新次数
"total_ms"
: 3395, #刷新总花费时长
"average_ms"
: 13.108108108108109, #平均时长
"last_ms"
: 1, #最后一次时长
"last_finished"
: ISODate(
"2011-07-23T06:07:22.725Z"
)#最后刷新时间
},
"cursors"
: {
"totalOpen"
: 0,#打开游标数
"clientCursors_size"
: 0,#客户端游标大小
"timedOut"
: 16#超时时间
},
"network"
: {
"bytesIn"
: 285676177,#输入数据(byte)
"bytesOut"
: 286564,#输出数据(byte)
"numRequests"
: 2012348#请求数
},
"opcounters"
: {
"insert"
: 2010000, #插入操作数
"query"
: 51,#查询操作数
"update"
: 5,#更新操作数
"delete"
: 0,#删除操作数
"getmore"
: 0,#获取更多的操作数
"command"
: 148#其他命令操作数
},
"asserts"
: {#各个断言的数量
"regular"
: 0,
"warning"
: 0,
"msg"
: 0,
"user"
: 2131,
"rollovers"
: 0
},
"writeBacksQueued"
:
false
,
"ok"
: 1
}
db.stats()查看某一个库的原先状况
> db.stats()
{
"db"
:
"order"
,#库名
"collections"
: 4,#集合数
"objects"
: 2011622,#记录数
"avgObjSize"
: 111.92214441878245,#每条记录的平均值
"dataSize"
: 225145048,#记录的总大小
"storageSize"
: 307323392,#预分配的存储空间
"numExtents"
: 21,#事件数
"indexes"
: 1,#索引数
"indexSize"
: 74187744,#所以大小
"fileSize"
: 1056702464,#文件大小
"ok"
: 1
}
|
查看集合记录用 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
> db.
order
.stats()
{
"ns"
:
"order.order"
,#命名空间
"count"
: 2010000,#记录数
"size"
: 225039600,#大小
"avgObjSize"
: 111.96,
"storageSize"
: 307186944,
"numExtents"
: 18,
"nindexes"
: 1,
"lastExtentSize"
: 56089856,
"paddingFactor"
: 1,
"flags"
: 1,
"totalIndexSize"
: 74187744,
"indexSizes"
: {
"_id_"
: 74187744#索引为_id_的索引大小
},
"ok"
: 1
}
|
mongostat命令查看运行中的实时统计,表示每秒实时执行的次数 。
mongodb还提供了一个机遇http的监控页面,可以访问http://ip:28017来查看,这个页面基本上是对上面的这些命令做了一下综合,所以这里不细述了.
最后此篇关于MongoDB性能优化及监控的文章就讲到这里了,如果你想了解更多关于MongoDB性能优化及监控的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
比较代码: const char x = 'a'; std::cout > (0C310B0h) 00C3100B add esp,4 和 const i
您好,我正在使用 Matlab 优化求解器,但程序有问题。我收到此消息 fmincon 已停止,因为目标函数值小于目标函数限制的默认值,并且约束满足在约束容差的默认值范围内。我也收到以下消息。警告:矩
处理Visual Studio optimizations的问题为我节省了大量启动和使用它的时间 当我必须进行 J2EE 开发时,我很难回到 Eclipse。因此,我还想知道人们是否有任何提示或技巧可
情况如下:在我的 Excel 工作表中,有一列包含 1-name 形式的条目。考虑到数字也可以是两位数,我想删除这些数字。这本身不是问题,我让它工作了,只是性能太糟糕了。现在我的程序每个单元格输入大约
这样做有什么区别吗: $(".topHorzNavLink").click(function() { var theHoverContainer = $("#hoverContainer");
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the cost of '$(this)'? 我经常在一些开发人员代码中看到$(this)引用同一个
我刚刚结束了一个大型开发项目。我们的时间紧迫,因此很多优化被“推迟”。既然我们已经达到了最后期限,我们将回去尝试优化事情。 我的问题是:优化 jQuery 网站时您要寻找的最重要的东西是什么。或者,我
所以我一直在用 JavaScript 编写游戏(不是网络游戏,而是使用 JavaScript 恰好是脚本语言的游戏引擎)。不幸的是,游戏引擎的 JavaScript 引擎是 SpiderMonkey
这是我在正在构建的页面中使用的 SQL 查询。它目前运行大约 8 秒并返回 12000 条记录,这是正确的,但我想知道您是否可以就如何使其更快提出可能的建议? SELECT DISTINCT Adve
如何优化这个? SELECT e.attr_id, e.sku, a.value FROM product_attr AS e, product_attr_text AS a WHERE e.attr
我正在使用这样的结构来测试是否按下了所需的键: def eventFilter(self, tableView, event): if event.type() == QtCore.QEven
我正在使用 JavaScript 从给定的球员列表中计算出羽毛球 double 比赛的所有组合。每个玩家都与其他人组队。 EG。如果我有以下球员a、b、c、d。它们的组合可以是: a & b V c
我似乎无法弄清楚如何让这个 JS 工作。 scroll function 起作用但不能隐藏。还有没有办法用更少的代码行来做到这一点?我希望 .down-arrow 在 50px 之后 fade out
我的问题是关于用于生产的高级优化级联样式表 (CSS) 文件。 多么最新和最完整(准备在实时元素中使用)的 css 优化器/最小化器,它们不仅提供删除空格和换行符,还提供高级功能,如删除过多的属性、合
我读过这个: 浏览器检索在 中请求的所有资源开始呈现 之前的 HTML 部分.如果您将请求放在 中section 而不是,那么页面呈现和下载资源可以并行发生。您应该从 移动尽可能多的资源请求。
我正在处理一些现有的 C++ 代码,这些代码看起来写得不好,而且调用频率很高。我想知道我是否应该花时间更改它,或者编译器是否已经在优化问题。 我正在使用 Visual Studio 2008。 这是一
我正在尝试使用 OpenGL 渲染 3 个四边形(1 个背景图,2 个 Sprite )。我有以下代码: void GLRenderer::onDrawObjects(long p_dt) {
我确实有以下声明: isEnabled = false; if(foo(arg) && isEnabled) { .... } public boolean foo(arg) { some re
(一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(no
一、写在前面 css的优化方案,之前没有提及,所以接下来进行总结一下。 二、具体优化方案 2.1、加载性能 1、css压缩:将写好的css进行打包,可以减少很多的体积。 2、css单一样式:在需要下边
我是一名优秀的程序员,十分优秀!