不管是在關(guān)系型還是非關(guān)系型數(shù)據(jù)庫中,查詢語句的優(yōu)化在數(shù)據(jù)庫的的優(yōu)化中占了很大比例。在Oracle中,通過性能視圖,可以獲取TOPSQL,而在Mysql、PG、Mongodb這些稍小型的數(shù)據(jù)庫中,均只能通過設(shè)置慢查詢閾值的方式,獲取慢SQL。在Mysql中,慢日志有獨(dú)立的慢日志文件,而PG和Mongo中慢日志都是輸出到數(shù)據(jù)庫的運(yùn)行日志里面。在Mongodb中,數(shù)據(jù)庫在輸出慢日志的同時(shí)會(huì)顯示語句執(zhí)行時(shí)的執(zhí)行計(jì)劃。
Mongodb慢日志通過如下參數(shù)設(shè)置:
operationProfiling:
mode: slowOp --表示抓取慢查詢
slowOpThresholdMs: 200 --抓取執(zhí)行時(shí)間超過200ms的查詢
也可以在實(shí)例啟動(dòng)后,在數(shù)據(jù)庫層動(dòng)態(tài)的設(shè)置慢查詢閾值db.setProfilingLevel(1,{ slowms: 200 })。
設(shè)置之后,在當(dāng)前數(shù)據(jù)庫中會(huì)產(chǎn)生一個(gè)名為system.profile的集合,該集合是一個(gè)capped集合,固定大小為1MB,當(dāng)超過1MB后,會(huì)自動(dòng)覆蓋舊數(shù)據(jù)。使用showprofile可以顯示最近的5條慢查詢記錄以及語句的執(zhí)行計(jì)劃。
同時(shí),在配置了慢查詢閾值后,mongodb會(huì)在運(yùn)行日志中打印出慢日志,如下: 8e126deb942317dd49c), syncId: "173758523", resourceId: "1115439752", type: "ml_song_material", originalStatus: "1", doneStatus: "0", lastModifiedTime: new Date(1601140961092) }, multi: false, upsert: true } planSummary: IDHACK keysEx amined:1 docsExamined:1 nMatched:1 nModified:1 keysInserted:3 keysDeleted:3 numYields:1 locks:{ Global: { acquireCount: { r: 4, w: 4 } }, Database: { acquireCount: { w: 4 } }, Collection: { acquireCount: { w: 3 } }, oplog: { acquireCo unt: { w: 1 } } } 221ms 2020-09-27T01:22:41.310+ |
由于在Mongodb中沒有綁定變量的概念,所以當(dāng)業(yè)務(wù)大量執(zhí)行慢查詢時(shí),system.profile集合中存不了多少數(shù)據(jù),且可能大都是不同變量的相同語句,同時(shí)在數(shù)據(jù)庫運(yùn)行日志中會(huì)出現(xiàn)慢查詢刷屏的現(xiàn)象。在這種情況下,建議使用mtools工具的mloginfo對(duì)慢查詢進(jìn)行分析和過濾,結(jié)果如下:
該工具會(huì)按照查詢條件進(jìn)行分組統(tǒng)計(jì),相當(dāng)于oracle的綁定變量,輸出結(jié)果直觀明了。
基本在所有的數(shù)據(jù)庫中,都可以使用explain查看語句的執(zhí)行計(jì)劃,Mongodb也不例外,其用法為db.collectionname.find({field_name:***}).explain();
例如:
同時(shí)也可以使用
db.collectionname.explain().find({field_name:***}).其中,explain支持如下3種模式:
db.Text.explain("queryPlanner").find({"txtId":"5855"});--只生成執(zhí)行計(jì)劃,默認(rèn)模式
db.Text.explain("executionStats").find({"txtId":"5855"});--生成執(zhí)行計(jì)劃并執(zhí)行,顯示被拒絕的執(zhí)行計(jì)劃,同時(shí)顯示執(zhí)行的統(tǒng)計(jì)信息
db.Text.explain("allPlansExecution").find({"txtId":"5855"});--包含以上兩種模式,并且顯示在生成執(zhí)行計(jì)劃時(shí)被拒絕的執(zhí)行計(jì)劃的統(tǒng)計(jì)信息,有點(diǎn)類似Oracle10053 event.
對(duì)于update和delete等寫操作,在explain()時(shí)會(huì)被執(zhí)行,但是結(jié)果不會(huì)應(yīng)用到數(shù)據(jù)庫。
示例(此處不描述輸出的各行信息的意思):
Mongodb的執(zhí)行計(jì)劃包括全表掃描(COLLSCAN)、索引掃描(IXSCAN)、分片合并(SHARD_MERGE)、_ID過濾(IDHACK),因?yàn)開ID列上有一個(gè)特殊的唯一索引,所以一般情況下來說如果語句的執(zhí)行計(jì)劃是IDHACK,無疑該執(zhí)行計(jì)劃是最優(yōu)的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/130125.html
摘要:優(yōu)志愿張海鵬宋體背景宋體每年月下旬到月下旬期間是高考填志愿的高峰期,也是優(yōu)志愿后端面臨大流量高并發(fā)請(qǐng)求的業(yè)務(wù)高峰期。對(duì)于優(yōu)志愿讀多寫少的場景及其業(yè)務(wù)高峰期,用戶可以按需增刪節(jié)點(diǎn),更好地實(shí)現(xiàn)讀取性能的擴(kuò)展。 隨著用戶規(guī)模的增長,數(shù)據(jù)庫的壓力也在成倍增加。面對(duì)大流量、高并發(fā),UCloud MongoDB 做到了高效,并展現(xiàn)出了更好的性能體驗(yàn)。 —— 優(yōu)志愿 CTO 張海鵬 背景...
我的專欄地址:我的segmentfault,歡迎瀏覽 一、執(zhí)行計(jì)劃介紹 MongoDB 3.0之后,explain的返回與使用方法與之前版本有了不少變化,介于3.0之后的優(yōu)秀特色,本文僅針對(duì)MongoDB 3.0+的explain進(jìn)行討論?,F(xiàn)版本explain有三種模式,分別如下: queryPlanner executionStats allPlansExecution 其中 qu...
摘要:正是存在問題,促使我們考慮引入數(shù)據(jù)庫審核平臺(tái)。的確,與很多互聯(lián)網(wǎng)公司相比,數(shù)據(jù)庫數(shù)十套的估摸并不是太大但與互聯(lián)網(wǎng)類公司不同,類似宜信這類金融類公司對(duì)數(shù)據(jù)庫的依賴性更大,大量的應(yīng)用是重?cái)?shù)據(jù)庫類的,且其使用復(fù)雜程度也遠(yuǎn)比互聯(lián)網(wǎng)類的復(fù)雜。 作者:韓鋒 出處:DBAplus社群分享 Themis開源地址:https://github.com/CreditEaseDBA 拓展閱讀:宜信開源|數(shù)...
摘要:整體來說,通過查看執(zhí)行計(jì)劃,分析查詢性能情況,可以幫助我們更好的分析和優(yōu)化,必要的時(shí)候可以創(chuàng)建索引,提升查詢性能。 一、概述 MongoDB中的explain()函數(shù)可以幫助我們查看查詢相關(guān)的信息,查詢分析可以確保我們創(chuàng)建的索引是否有效,是查詢語句性能分析的重要工具。 二、explain()基本用法 explain()的用法是必須放在最后面,語法如下: db.collecton.fin...
閱讀 1459·2023-01-11 13:20
閱讀 1815·2023-01-11 13:20
閱讀 1267·2023-01-11 13:20
閱讀 2007·2023-01-11 13:20
閱讀 4227·2023-01-11 13:20
閱讀 2885·2023-01-11 13:20
閱讀 1489·2023-01-11 13:20
閱讀 3814·2023-01-11 13:20