首頁 資料庫 mysql教程 MongoDB数据库分析器

MongoDB数据库分析器

Jun 07, 2016 pm 03:05 PM
mongodb 分析器 引言 資料庫 運行

一、引言 当数据库运行慢时,我们需要找出其中的性能瓶颈。找出性能瓶颈的第一步就是找出数据库正在忙什么,然后再找出其中最慢的操作进行优化。MongoDB提供了数据库分析器收集在实例上执行的写操作、游标、命令等详细信息。MongoDB数据库分析器可以在实例级

一、引言

当数据库运行慢时,我们需要找出其中的性能瓶颈。找出性能瓶颈的第一步就是找出数据库正在忙什么,然后再找出其中最慢的操作进行优化。MongoDB提供了数据库分析器收集在实例上执行的写操作、游标、命令等详细信息。MongoDB数据库分析器可以在实例级别打开,也可以在数据库级别打开。
MongoDB数据库分析器可以设置三个级别:
0 - 分析器处在关闭状态,不收集任何数据
1 - 仅仅收集较慢操作的分析数据。默认情况下如果一个操作花费的时间超过100ms,就认为是较慢的操作。
2 - 收集所有数据库操作的分析数据。

二、system.profile集合

MongoDB数据库分析器收集的数据将存放在system.profile集合中。system.profile是一个固定大小的集合,数据将循环写入该集合。当用完所有分配的空间后,MongoDB将会覆盖集合中最老的文档。默认情况下,system.profile集合大小为4M。

system.profile集合常用的字段包括:
ts:数据库操作发生的时间戳
op:操作类型,可能的取值为insert,query,update,remove,getmore,command
ns:操作对象的名字
query:查询语句
nreturned:返回的文档数
nscanned:为执行操作扫描的文档数
millis:执行操作花费的时间

三、设置数据库分析器级别

MongoDB数据库分析器具有三个级别,可以通过mongo Shell设置:

db.getProfilingLevel():获取当前的profile级别

db.getProfilingStatus():获取当前的profile级别,同时返回slowms阈值。

db.setProfilingLevel():设置profile级别


我们可以尝试着把分析器级别设置为1,把slowms设置为500ms:

db.setProfilingLevel(1,500)
{ "was" : 0, "slowms" : 100, "ok" : 1 }

执行结果中was字段显示原分析器级别为0,slowms字段显示原慢操作阈值为100ms。使db.getProfilingStatus()查询新的分析器设置:

db.getProfilingStatus()
{ "was" : 1, "slowms" : 500 }

执行结果显示分析器级别已设置为1,表明mongodb将记录执行时间超过500ms的所有操作。

四、查看分析器数据并进行分析

首先我们进行初始的数据准备,建立mydb库,在其中建test集合,并插入1000万条数据:

use mydb

db.test.drop()

for (var i=1;i

清空system.profile集合,设置分析级别为2,慢操作的阈值为100ms:
use mydb
db.setProfilingLevel(0)
db.system.profile.drop()
db.setProfilingLevel(2,100)

在没有索引的情况下查询empno大于99999999的文档:

db.test.find({empno:{$gt:9999999}})

查询到一条结果,因此网络:
{ "_id" : ObjectId("523ad4d465fdfe550ae05d97"), "empno" : 10000000, "name" : 10000000, "address" : "AAAAAAAAAAAAAAAAAAAAAAAAAAA" }

在empno创建索引:

db.test.ensureIndex({empno:1})

重新查询empno大于99999999的文档得到的结果相同。

查询system.profile中存储的分析数据,按照发生的时间排序:

db.system.profile.find().limit(10).sort( { ts : 1 } ).pretty()

得到结果:
{
        "op" : "query",
        "ns" : "mydb.system.indexes",
        "query" : {
                "expireAfterSeconds" : {
                        "$exists" : true
                }
        },
        "ntoreturn" : 0,
        "ntoskip" : 0,
        "nscanned" : 1,
        "keyUpdates" : 0,
        "numYield" : 0,
        "lockStats" : {
                "timeLockedMicros" : {
                        "r" : NumberLong(44),
                        "w" : NumberLong(0)
                },
                "timeAcquiringMicros" : {
                        "r" : NumberLong(2),
                        "w" : NumberLong(57806)
                }
        },
        "nreturned" : 0,
        "responseLength" : 20,
        "millis" : 0,
        "ts" : ISODate("2013-09-19T10:47:00.656Z"),
        "client" : "0.0.0.0",
        "allUsers" : [
                {
                        "user" : "__system",
                        "userSource" : "local"
                }
        ],
        "user" : "
__system@local"
}
{
        "op" : "query",
        "ns" : "mydb.test",
        "query" : {
                "empno" : {
                        "$gt" : 9999999
                }
        },
        "ntoreturn" : 0,
        "ntoskip" : 0,
        "nscanned" : 10000000,
        "keyUpdates" : 0,
        "numYield" : 29,
        "lockStats" : {
                "timeLockedMicros" : {
                        "r" : NumberLong(59258536),
                        "w" : NumberLong(0)
                },
                "timeAcquiringMicros" : {
                        "r" : NumberLong(29469480),
                        "w" : NumberLong(6)
                }
        },
        "nreturned" : 1,
        "responseLength" : 112,
        "millis" : 29861,
        "ts" : ISODate("2013-09-19T10:47:21.476Z"),
        "client" : "127.0.0.1",
        "allUsers" : [ ],
        "user" : ""
}
{
        "op" : "query",
        "ns" : "mydb.system.indexes",
        "query" : {
                "expireAfterSeconds" : {
                        "$exists" : true
                }
        },
        "ntoreturn" : 0,
        "ntoskip" : 0,
        "nscanned" : 1,
        "keyUpdates" : 0,
        "numYield" : 0,
        "lockStats" : {
                "timeLockedMicros" : {
                        "r" : NumberLong(171),
                        "w" : NumberLong(0)
                },
                "timeAcquiringMicros" : {
                        "r" : NumberLong(8),
                        "w" : NumberLong(4)
                }
        },
        "nreturned" : 0,
        "responseLength" : 20,
        "millis" : 0,
        "ts" : ISODate("2013-09-19T10:48:00.661Z"),
        "client" : "0.0.0.0",
        "allUsers" : [
                {
                        "user" : "__system",
                        "userSource" : "local"
                }
        ],
        "user" : "
__system@local"
}
{
        "op" : "query",
        "ns" : "mydb.system.indexes",
        "query" : {
                "expireAfterSeconds" : {
                        "$exists" : true
                }
        },
        "ntoreturn" : 0,
        "ntoskip" : 0,
        "nscanned" : 1,
        "keyUpdates" : 0,
        "numYield" : 0,
        "lockStats" : {
                "timeLockedMicros" : {
                        "r" : NumberLong(41),
                        "w" : NumberLong(0)
                },
                "timeAcquiringMicros" : {
                        "r" : NumberLong(3),
                        "w" : NumberLong(2)
                }
        },
        "nreturned" : 0,
        "responseLength" : 20,
        "millis" : 0,
        "ts" : ISODate("2013-09-19T10:49:00.677Z"),
        "client" : "0.0.0.0",
        "allUsers" : [
                {
                        "user" : "__system",
                        "userSource" : "local"
                }
        ],
        "user" : "
__system@local"
}
{
        "op" : "insert",
        "ns" : "mydb.system.indexes",
        "query" : {
                "v" : 1,
                "key" : {
                        "empno" : 1
                },
                "ns" : "mydb.test",
                "name" : "empno_1"
        },
        "ninserted" : 1,
        "keyUpdates" : 0,
        "numYield" : 0,
        "lockStats" : {
                "timeLockedMicros" : {
                        "r" : NumberLong(0),
                        "w" : NumberLong(145940925)
                },
                "timeAcquiringMicros" : {
                        "r" : NumberLong(0),
                        "w" : NumberLong(292871)
                }
        },
        "millis" : 145977,
        "ts" : ISODate("2013-09-19T10:51:37.246Z"),
        "client" : "127.0.0.1",
        "allUsers" : [ ],
        "user" : ""
}
{
        "op" : "query",
        "ns" : "mydb.system.indexes",
        "query" : {
                "expireAfterSeconds" : {
                        "$exists" : true
                }
        },
        "ntoreturn" : 0,
        "ntoskip" : 0,
        "nscanned" : 2,
        "keyUpdates" : 0,
        "numYield" : 1,
        "lockStats" : {
                "timeLockedMicros" : {
                        "r" : NumberLong(598801),
                        "w" : NumberLong(0)
                },
                "timeAcquiringMicros" : {
                        "r" : NumberLong(96316198),
                        "w" : NumberLong(13)
                }
        },
        "nreturned" : 0,
        "responseLength" : 20,
        "millis" : 1107,
        "ts" : ISODate("2013-09-19T10:51:38.122Z"),
        "client" : "0.0.0.0",
        "allUsers" : [
                {
                        "user" : "__system",
                        "userSource" : "local"
                }
        ],
        "user" : "
__system@local"
}
{
        "op" : "query",
        "ns" : "mydb.system.indexes",
        "query" : {
                "expireAfterSeconds" : {
                        "$exists" : true
                }
        },
        "ntoreturn" : 0,
        "ntoskip" : 0,
        "nscanned" : 2,
        "keyUpdates" : 0,
        "numYield" : 0,
        "lockStats" : {
                "timeLockedMicros" : {
                        "r" : NumberLong(54),
                        "w" : NumberLong(0)
                },
                "timeAcquiringMicros" : {
                        "r" : NumberLong(3),
                        "w" : NumberLong(2)
                }
        },
        "nreturned" : 0,
        "responseLength" : 20,
        "millis" : 0,
        "ts" : ISODate("2013-09-19T10:52:38.260Z"),
        "client" : "0.0.0.0",
        "allUsers" : [
                {
                        "user" : "__system",
                        "userSource" : "local"
                }
        ],
        "user" : "
__system@local"
}
{
        "op" : "query",
        "ns" : "mydb.test",
        "query" : {
                "empno" : {
                        "$gt" : 9999999
                }
        },
        "ntoreturn" : 0,
        "ntoskip" : 0,
        "nscanned" : 1,
        "keyUpdates" : 0,
        "numYield" : 0,
        "lockStats" : {
                "timeLockedMicros" : {
                        "r" : NumberLong(125810),
                        "w" : NumberLong(0)
                },
                "timeAcquiringMicros" : {
                        "r" : NumberLong(4),
                        "w" : NumberLong(6)
                }
        },
        "nreturned" : 1,
        "responseLength" : 112,
        "millis" : 125,
        "ts" : ISODate("2013-09-19T10:52:40.258Z"),
        "client" : "127.0.0.1",
        "allUsers" : [ ],
        "user" : ""
}


我们看到执行的两次同样的查询和一次索引创建操作都在其中。
第一次查询的时间戳为2013-09-19T10:47:21.476Z,nscanned为1000万,nreturned为1 ,操作本身耗时29861ms。

上述查询是没有索引的情况下执行的,为优化查询,我们在empno上创建了索引。从system.profile查询结果可以看出创建索引的op为insert,操作的名字空间为mydb.system.indexes,创建的索引名称为empno_1。创建索引本身耗时145977ms。

我们第二次执行查询的时间戳为2013-09-19T10:52:40.258Z,nscanned为1,nreturned为1,操作本身耗时125ms。

从system.profile输出,我们可以看出有索引的查询要比没有索引的查询快很多。

 

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在Debian上配置MongoDB自動擴容 如何在Debian上配置MongoDB自動擴容 Apr 02, 2025 am 07:36 AM

本文介紹如何在Debian系統上配置MongoDB實現自動擴容,主要步驟包括MongoDB副本集的設置和磁盤空間監控。一、MongoDB安裝首先,確保已在Debian系統上安裝MongoDB。使用以下命令安裝:sudoaptupdatesudoaptinstall-ymongodb-org二、配置MongoDB副本集MongoDB副本集確保高可用性和數據冗餘,是實現自動擴容的基礎。啟動MongoDB服務:sudosystemctlstartmongodsudosys

mysql:簡單的概念,用於輕鬆學習 mysql:簡單的概念,用於輕鬆學習 Apr 10, 2025 am 09:29 AM

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

MongoDB在Debian上的高可用性如何保障 MongoDB在Debian上的高可用性如何保障 Apr 02, 2025 am 07:21 AM

本文介紹如何在Debian系統上構建高可用性的MongoDB數據庫。我們將探討多種方法,確保數據安全和服務持續運行。關鍵策略:副本集(ReplicaSet):利用副本集實現數據冗餘和自動故障轉移。當主節點出現故障時,副本集會自動選舉新的主節點,保證服務的持續可用性。數據備份與恢復:定期使用mongodump命令進行數據庫備份,並製定有效的恢復策略,以應對數據丟失風險。監控與報警:部署監控工具(如Prometheus、Grafana)實時監控MongoDB的運行狀態,並

MySQL:世界上最受歡迎的數據庫的簡介 MySQL:世界上最受歡迎的數據庫的簡介 Apr 12, 2025 am 12:18 AM

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

為什麼要使用mysql?利益和優勢 為什麼要使用mysql?利益和優勢 Apr 12, 2025 am 12:17 AM

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

Navicat查看MongoDB數據庫密碼的方法 Navicat查看MongoDB數據庫密碼的方法 Apr 08, 2025 pm 09:39 PM

直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。

Pi幣重大更新:Pi Bank要來了! Pi幣重大更新:Pi Bank要來了! Mar 03, 2025 pm 06:18 PM

PiNetwork即將推出革命性移動銀行平台PiBank! PiNetwork今日發布重大更新Elmahrosa(Face)PIMISRBank,簡稱PiBank,它將傳統銀行服務與PiNetwork加密貨幣功能完美融合,實現法幣與加密貨幣的原子交換(支持美元、歐元、印尼盾等法幣與PiCoin、USDT、USDC等加密貨幣的互換)。究竟PiBank有何魅力?讓我們一探究竟! PiBank主要功能:一站式管理銀行賬戶和加密貨幣資產。支持實時交易,並採用生物特

mongodb索引怎麼排序 mongodb索引怎麼排序 Apr 12, 2025 am 08:45 AM

排序索引是 MongoDB 索引的一種,允許按特定字段對集合中的文檔排序。創建排序索引可以快速排序查詢結果,無需額外的排序操作。優勢包括快速排序、覆蓋查詢和按需排序。語法為 db.collection.createIndex({ field: <sort order> }),其中 <sort order> 為 1(升序)或 -1(降序)。還可以創建對多個字段進行排序的多字段排序索引。

See all articles