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