db.setProfilingLevel(1,500) 2.然后再通過.explain()解析影響行數(shù),分析為什么超過50..."/>
溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mongodb慢查詢分析

發(fā)布時(shí)間:2020-08-08 22:03:00 來源:ITPUB博客 閱讀:151 作者:kunlunzhiying 欄目:關(guān)系型數(shù)據(jù)庫

1.用慢查詢?nèi)罩荆╯ystem.profile)找到超過500ms的語句 

mongos>db.setProfilingLevel(1,500)

2.然后再通過.explain()解析影響行數(shù),分析為什么超過500ms【即看執(zhí)行計(jì)劃】 參見下文評(píng)論鏈接

3. 決定是否是缺失索引導(dǎo)致


#查看狀態(tài):級(jí)別和時(shí)間

PRIMARY> db.getProfilingStatus()

{ "was" : 1, "slowms" : 200 }

#查看級(jí)別

PRIMARY> db.getProfilingLevel()

1

#設(shè)置級(jí)別

PRIMARY> db.setProfilingLevel(2)

{ "was" : 1, "slowms" : 100, "ok" : 1 }

#設(shè)置級(jí)別和時(shí)間

PRIMARY> db.setProfilingLevel(1,200)

{ "was" : 2, "slowms" : 100, "ok" : 1 }

 Profiling級(jí)別說明

參數(shù):

0:關(guān)閉,不收集任何數(shù)據(jù)。

1:收集慢查詢數(shù)據(jù),默認(rèn)是100毫秒。

2:收集所有數(shù)據(jù)

注意:

  1  以上要操作要是在test集合下面的話,只對(duì)該集合里的操作有效,要是需要對(duì)整個(gè)實(shí)例有效,則需要在所有的集合下設(shè)置或則在開啟的時(shí)候開啟參數(shù)

  2 每次設(shè)置之后返回給你的結(jié)果是修改之前的狀態(tài)(包括級(jí)別、時(shí)間參數(shù))


2:不通過mongo shell


mongoDB啟動(dòng)的時(shí)候


mongod --profile=1  --slowms=200


或則在配置文件里添加2行:

profile = 1

slowms = 200

3:關(guān)閉Profiling

# 關(guān)閉

PRIMARY> db.setProfilingLevel(0)

{ "was" : 1, "slowms" : 200, "ok" : 1 }


4:修改“慢查詢?nèi)罩尽钡拇笮?

#關(guān)閉Profiling

PRIMARY> db.setProfilingLevel(0)

{ "was" : 0, "slowms" : 200, "ok" : 1 }

#刪除system.profile集合

PRIMARY> db.system.profile.drop()


慢查詢(system.profile)分析 


 3.2: 分析

如果發(fā)現(xiàn) millis 值比較大,那么就需要作優(yōu)化。

1  如果nscanned數(shù)很大,或者接近記錄總數(shù)(文檔數(shù)),那么可能沒有用到索引查詢,而是全表掃描。

2  如果 nscanned 值高于 nreturned 的值,說明數(shù)據(jù)庫為了找到目標(biāo)文檔掃描了很多文檔。這時(shí)可以考慮創(chuàng)建索引來提高效率。


‘type’的返回參數(shù)說明:


COLLSCAN  #全表掃描

IXSCAN  #索引掃描

FETCH  #根據(jù)索引去檢索指定document

SHARD_MERGE  #將各個(gè)分片返回?cái)?shù)據(jù)進(jìn)行merge

SORT  #表明在內(nèi)存中進(jìn)行了排序(與老版本的scanAndOrder:true一致)

LIMIT  #使用limit限制返回?cái)?shù)

SKIP  #使用skip進(jìn)行跳過

IDHACK  #針對(duì)_id進(jìn)行查詢

SHARDING_FILTER #通過mongos #對(duì)分片數(shù)據(jù)進(jìn)行查詢

COUNT #利用db.coll.explain().count()之類進(jìn)行count運(yùn)算

COUNTSCAN #count不使用Index進(jìn)行count時(shí)的stage返回

COUNT_SCAN #count使用了Index進(jìn)行count時(shí)的stage返回

SUBPLA #未使用到索引的$or查詢的stage返回

TEXT #使用全文索引進(jìn)行查詢時(shí)候的stage返回

PROJECTION #限定返回字段時(shí)候stage的返回


對(duì)于普通查詢,我們最希望看到的組合有這些:

Fetch+IDHACK

Fetch+ixscan

Limit+(Fetch+ixscan)

PROJECTION+ixscan

SHARDING_FILTER+ixscan

不希望看到包含如下的type:


COLLSCAN(全表掃),SORT(使用sort但是無index),不合理的SKIP,SUBPLA(未用到index的$or)

對(duì)于count查詢,希望看到的有:

COUNT_SCAN

不希望看到的有:

COUNTSCAN


4  性能(explain) 參考mongodb 官網(wǎng)鏈接 見下文評(píng)論

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI