数据库分析器捕获有关读取和写入操作,游标操作和数据库命令的数据信息。要配置数据库分析器并设置捕获分析数据的阈值,请参阅Database Profiler部分。
数据库分析器将数据写入system.profile集合,该集合是一个固定集合。要查看分析器的输出,请在system.profile集合上使用正常的MongoDB查询。
注意: 由于数据库分析器将数据写入数据库中的system.profile集合,因此分析器将分析一些写入活动,即使对于只读的数据库也是如此。
system.profile集合中的文档具有以下形式。本示例文档反映了单机mongod上的查找操作:
{
"op" : "query",
"ns" : "test.c",
"query" : {
"find" : "c",
"filter" : {
"a" : 1
}
},
"keysExamined" : 2,
"docsExamined" : 2,
"cursorExhausted" : true,
"keyUpdates" : 0,
"writeConflicts" : 0,
"numYield" : 0,
"locks" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(2)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(1)
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(1)
}
}
},
"nreturned" : 2,
"responseLength" : 108,
"protocol" : "op_command",
"millis" : 0,
"execStats" : {
"stage" : "FETCH",
"nReturned" : 2,
"executionTimeMillisEstimate" : 0,
"works" : 3,
"advanced" : 2,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"docsExamined" : 2,
"alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 2,
"executionTimeMillisEstimate" : 0,
"works" : 3,
"advanced" : 2,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"keyPattern" : {
"a" : 1
},
"indexName" : "a_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"a" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"a" : [
"[1.0, 1.0]"
]
},
"keysExamined" : 2,
"dupsTested" : 0,
"dupsDropped" : 0,
"seenInvalidated" : 0
}
},
"ts" : ISODate("2015-09-03T15:26:14.948Z"),
"client" : "127.0.0.1",
"allUsers" : [ ],
"user" : ""
}
对于任何单一操作,由数据库分析器创建的文档都将包含以下字段的子集。依据操作类型的不同所记录的文档字段不同。
在版本3.2.0中进行了更改: system.profile.query.skip
替换了system.profile.ntoskip
字段。
在版本3.2.0中进行了更改:system.profile.ntoreturn
字段中的信息已被两个单独的字段system.profile.query.limit
和system.profile.query.batchSize
取代。
较老的驱动程序或较早版本的mongo shell
可能仍然使用ntoreturn
; 这将显示为system.profile.query.ntoreturn
。
操作的类型。可能的值是:
insert
query
update
remove
getmore
command
操作目标的名称空间。MongoDB中的名称空间采用数据库的形式,后跟一个点(.),后跟集合的名称。
使用的查询文档或插入操作插入的文档。如果文档超过50千字节,则该值是该对象的字符串摘要。如果字符串摘要超过50千字节,则字符串摘要将被截断,并在字符串末尾用省略号(…)表示。
命令操作。如果命令文档超过50千字节,则该值为该对象的字符串摘要。如果字符串摘要超过50千字节,则字符串摘要将被截断,并在字符串末尾用省略号(…)表示。
更新操作期间传入的
文档。如果文档超过50千字节,则该值是该对象的字符串摘要。如果字符串摘要超过50千字节,则字符串摘要将被截断,并在字符串末尾用省略号(…)表示。
query
和getmore
操作访问的游标ID。
MongoDB为了执行操作而扫描的索引键的数量。
★ 通常,如果keysExamined远远高于nreturned,则数据库正在扫描许多索引键以查找结果文档。考虑创建或调整索引以提高查询性能。
MongoDB为了执行操作而扫描的集合中的文档数量。
当更新操作将一个或多个文档移动到磁盘上的新位置时,此字段的值为true
。如果操作没有导致移动,则此字段不会显示。导致移动的操作比就地更新需要更多时间,并且通常由于文档增长而发生。
hasSortStage是一个布尔值,当查询不能使用索引中的顺序来返回请求的排序结果时,该值为true
; 即MongoDB在收到来自游标的文档后必须对文档进行排序。该字段仅在值为true
时才会显示。
操作删除的文档数量。
操作插入的文档数量。
与更新操作的system.profile.query
查询条件相匹配的文档数量。
由更新操作修改的文档数量。
指示更新操作的upsert
选项值的布尔值。只有当upsert
为true
时才会出现。
操作中更新的索引键数量。更改索引键会带来较低的性能成本,因为数据库必须删除旧索引键并将新索引键插入到B-tree。
一个布尔值,指示查询计划员在选择查询的获胜执行计划之前是否评估了多个计划。该字段仅在值为true
时才会显示。
一个布尔值,指示查询系统是否逐出了缓存计划并重新评估了所有候选计划。该字段仅在值为true
时才会显示。
为给定的写入操作插入的索引键的数量。
写入操作期间遇到的冲突次数;例如: 更新操作会尝试修改与另一个更新操作相同的文档。另请参阅写入冲突。
为允许其他操作完成,该操作yielded(让出执行权)的次数。通常,当他们需要访问MongoDB尚未完全读入内存的数据时,操作就会yield。这允许在内存中有数据的其他操作先完成直到MongoDB为yielding操作读入数据。
有关更多信息,请参阅关于何时操作yield的常见问题。
system.profile.locks提供了在操作过程中持有的各种锁类型和锁模式的信息。
可能的锁类型是:
锁类型 | 说明 |
---|---|
Global |
代表全局锁。 |
MMAPV1Journal |
表示MMAPv1 存储引擎特定的锁定,用于同步journal写入; 对于非MMAPv1 存储引擎,MMAPV1Journal 的模式为空。 |
Database |
代表数据库锁。 |
Collection |
代表集合锁。 |
Metadata |
代表元数据锁。 |
oplog |
代表对oplog的锁。 |
锁类型的可能锁定模式如下所示:
锁定模式 | 说明 |
---|---|
R |
表示共享(S)锁定。 |
W |
表示独占(X)锁定。 |
r |
表示意图共享(IS)锁定。 |
w |
表示意图独占(IX)锁定。 |
返回的各种锁类型的锁信息包括:
操作在指定模式下获取锁的次数。
由于锁冲突,操作必须等待获取acquireCount锁的次数。
acquireWaitCount ≤ acquireCount
操作必须等待以获取锁的累计时间(以微秒为单位)。
timeAcquiringMicros/acquireWaitCount ≈ 特定锁定模式的平均等待时间
操作在等待获取锁定时遇到死锁的次数。
有关锁定模式的更多信息,请参阅MongoDB使用何种类型的锁定?
操作返回的文档数量。
操作返回的文档的字节长度。
★ 大的响应长度会影响性能。要限制查询操作的结果文档的大小,可以使用以下任何一项:
注意: 当MongoDB将查询分析信息写入日志时,
responseLength
值位于名为reslen
的字段中。
MongoDB Wire Protocol请求消息格式。
从mongod的角度看操作开始到操作结束的时间,以毫秒为单位。
包含查询操作的执行统计信息的文档。对于其他操作,该值为空文档。
system.profile.execStats
将统计信息显示为一棵树;每个节点都提供在该查询操作阶段执行的操作的统计信息。
注意: 以下
execStats
字段列表并不详尽,因为每个阶段返回的字段不同。
作为查询执行中的 一部分执行操作 的描述性名称; 例如:
COLLSCAN
全表扫描IXSCAN
索引键扫描FETCH
检索文档包含作为当前阶段输入阶段的操作统计信息的数组。
操作的时间戳。
操作发起的客户端连接的IP地址或主机名。
对于某些操作,例如db.eval(),客户端是0.0.0.0:0,而不是实际的客户端。
此次会话的一组通过验证的用户信息(用户名和数据库)。另见用户。
运行该操作的经过身份验证的用户。如果操作未由经过身份验证的用户运行,则此字段的值为空字符串。
参考文档: MongoDB Database Profiler Output & Explain Results