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