MongoDB:索引

目錄

1、索引數據結構:B-樹

2、索引類型

2.1?單字段索引

2.2?復合索引(最重要!)

2.3?多鍵索引(數組字段)

2.4?地理空間索引

2.5?全文索引

2.6?哈希索引(分片專用)

2.7?TTL 索引(自動過期)

3、索引管理操作

3.1?創建索引

3.2?查看索引

3.3?刪除索引

3.4?修改索引(隱藏/重建)

4、explain分析執行計劃

5、慢查詢分析

5.1 開啟慢查詢記錄

5.2 慢查詢日志分析


1、索引數據結構:B-樹

MongoDB使用B-樹,所有節點都有Data域,只要找到指定索引就可以進?訪問,單次查詢從結構上來看要快于MySql。

2、索引類型

2.1?單字段索引

// 創建:在 age 字段升序索引
db.users.createIndex({ age: 1 }) 
  • 適用:等值查詢、范圍掃描(age: 25?或?age: { $gt: 30 }

2.2?復合索引(最重要!)

// 創建:先按 city 排序,再按 age 排序
db.users.createIndex({ city: 1, age: -1 })
  • 最左前綴原則
    ? 有效查詢:{ city: "北京" }{ city: "上海", age: { $lt: 30 } }
    ? 無效查詢:{ age: 25 }(無法命中索引)

2.3?多鍵索引(數組字段)

// tags 是數組字段:["sports", "music"]
db.products.createIndex({ tags: 1 })
  • 行為:為數組中的?每個元素?創建獨立索引項

  • 限制:復合索引中?最多一個數組字段

2.4?地理空間索引

// 2dsphere 索引(地球球面坐標)
db.places.createIndex({ loc: "2dsphere" })

查詢示例:

db.places.find({loc: {$near: {$geometry: { type: "Point", coordinates: [116.4, 39.9] },$maxDistance: 1000 // 1公里內}}
})

2.5?全文索引

db.articles.createIndex({ content: "text" })
  • 支持:多語言分詞、停用詞過濾

  • 搜索:db.articles.find({ $text: { $search: "mongodb tutorial" } })

2.6?哈希索引(分片專用)

db.users.createIndex({ _id: "hashed" }) // 分片鍵均勻分布

2.7?TTL 索引(自動過期)

// 文檔在 create_time 后 3600 秒自動刪除
db.logs.createIndex({ create_time: 1 }, { expireAfterSeconds: 3600 })
 

3、索引管理操作

3.1?創建索引

// 后臺構建(不阻塞讀寫)
db.orders.createIndex({ product_id: 1 }, { background: true })

3.2?查看索引

db.collection.getIndexes()
// 輸出:
[{ "v": 2, "key": { "_id": 1 }, "name": "_id_" },{ "v": 2, "key": { "city": 1, "age": -1 }, "name": "city_1_age_-1" }
]

3.3?刪除索引

db.users.dropIndex("city_1_age_-1")

3.4?修改索引(隱藏/重建)

// 隱藏索引(測試性能影響)
db.coll.hideIndex("index_name")
// 重建索引(碎片整理)
db.coll.reIndex()

4、explain分析執行計劃

db.orders.find({ user_id: 100 }).explain("executionStats")

注意:索引不是免費的?— 每個索引增加 10-20% 的寫入開銷。

explain()接收不同的參數,通過設置不同參數我們可以查看更詳細的查詢計劃。

  • queryPlanner:queryPlanner是默認參數,具體執行計劃信息參考下面的表格。
  • executionStats:executionStats會返回執行計劃的一些統計信息(有些版本中和allPlansExecution等同)。
  • allPlansExecution:allPlansExecution用來獲取所有執行計劃,結果參數基本與上文相同。

1>?queryPlanner默認參數

2>?executionStats參數

理想狀態:nReturned =?totalKeysExamined =?totalDocsExamined

stage的類型:

階段說明優化建議
COLLSCAN全集合掃描必須添加索引
IXSCAN索引掃描檢查索引效率
FETCH文檔獲取減少回表次數
SORT內存排序添加排序索引
LIMIT結果限制-
SKIP結果跳過避免大數據集skip
COUNT_SCAN計數掃描高效計數

5、慢查詢分析

慢查詢

  • 定義:執行時間超過設定閾值的操作(默認100ms)

  • 范圍:包括查詢、更新、刪除、聚合等所有數據庫操作

  • 關鍵指標:執行時間、掃描文檔數、返回文檔數、索引使用情況

5.1 開啟慢查詢記錄

// 設置慢查詢閾值(單位:毫秒)
db.setProfilingLevel(1, { slowms: 50 }) // 查看當前配置
db.getProfilingStatus()
/* 輸出:
{"was": 1,"slowms": 50,"sampleRate": 1.0
}
*/
參數默認值說明生產建議
slowms100慢查詢閾值(毫秒)50-100ms
sampleRate1.0采樣率(1.0=記錄所有慢查詢)0.5(高負載系統)
profile00=關閉,1=慢查詢,2=所有操作1

配置文件設置(mongod.conf):

operationProfiling:mode: slowOp               # 僅記錄慢查詢slowOpThresholdMs: 50      # 50ms閾值slowOpSampleRate: 0.5      # 50%采樣率

5.2 慢查詢日志分析

查看慢查詢日志:

// 按執行時間倒序查看
db.system.profile.find().sort({ millis: -1 }).limit(5)

關鍵日志字段解析:

字段說明優化關注點
op操作類型(query/update/remove)高頻操作類型
ns命名空間(database.collection)熱點集合
millis執行時間(毫秒)>100ms需優化
keysExamined掃描索引鍵數量對比nreturned
docsExamined掃描文檔數量過高需索引優化
nreturned返回文檔數量對比keysExamined
planSummary執行計劃摘要COLLSCAN需警惕
command完整命令(含查詢條件)查詢模式分析

慢查詢特征分析:

// 分析不同操作的慢查詢分布
db.system.profile.aggregate([{ $group: { _id: "$op", count: { $sum: 1 },avgTime: { $avg: "$millis" },maxTime: { $max: "$millis" }}}
])// 分析TOP慢查詢集合
db.system.profile.aggregate([{ $group: { _id: "$ns", count: { $sum: 1 },queries: { $push: { query: "$command", time: "$millis" } }}},{ $sort: { count: -1 } },{ $limit: 3 }
])

之后通過4分析執行計劃

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85850.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85850.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【大模型】Transformer架構完全解讀:從“盲人摸象“到“通曉萬物“的AI進化論

🤖 Transformer架構完全解讀:從"盲人摸象"到"通曉萬物"的AI進化論 —— 一位大模型探索者的技術日記 ? 第一章:為什么說Transformer是AI界的"蒸汽機革命"? 1.1 從RNN到Transformer:…

JavaEE:使用JMeter進行接口并發測試

一、下載與安裝: 1.下載apache-jmeter-5.6.3.zip: https://jmeter.apache.org/download_jmeter.cgi 2.解壓到D:\Program Files\apache-jmeter-5.6.3目錄 3.添加JDK環境配置到D:\Program Files\apache-jmeter-5.6.3\bin\jmeter.bat文件開頭&#xff1…

【筆記】MSYS2 的 MinGW64 環境中正確安裝 Python 相關環境管理工具 (Poetry、Virtualenv、Pipenv 和 UV)

MSYS2 環境配置與 Python 項目依賴管理筆記_msys更新python-CSDN博客 【技術筆記】MSYS2 指定 Python 版本安裝方案_pacman -u 安裝指定版本-CSDN博客 更多關于 MSYS2 開發環境的配置,請查看往期筆記。 簡介 本筆記將記錄我們在 MSYS2 的 MinGW64 環境中安裝 Pytho…

ubuntu添加域名解析服務器地址

在 Ubuntu 中配置域名解析主要有兩種方式:靜態修改 /etc/hosts 文件 和 動態修改 DNS 解析服務器配置。以下是詳細操作指南: 建議優選:二、永久方案:修改 DNS 解析服務(推薦)中的方法1 一、臨時方案:修改…

通過 AIOps 、生成式 AI 和機器學習實現更智能的可觀測性

支持 AIOps 的理由 人工智能運維(AIOps)是將人工智能(AI)、機器學習(ML)和分析技術應用于提升 IT 運維團隊日常工作的過程。簡單來說,AIOps 是軟件系統通過 AI 和 ML 以及相關分析技術來簡化和…

【DataWhale組隊學習】AI辦公實踐與應用

AI辦公-PPT制作 1. 使用大模型制作PPT的常見流程 使用大模型生成PPT的文稿將文稿的內容喂給可以直接生成PPT的大模型,生成PPT 2. 使用大模型生成PPT文稿 我們可以先使用上一章提過的那些大模型去生成一個PPT的文稿。那根據上一章的內容,我們想要去讓…

人機融合智能 | 人智交互中的機器行為設計與管理

以人工智能為代表的科學技術正在深入地塑造和改變著人類的社會、文化和經濟等,在“無所不在的算法與智能”的時代,了解智能機器的行為對于設計智能行為并使其造福于人類,對于智能機器的設計者、開發者和使用者,都具有重要意義。機器行為研究從學科交叉的視角,將智能機器行為置于…

langChainv0.3學習筆記(高級篇)

目錄 工具創建工具從函數創建工具tool 裝飾器結構化工具 從可運行對象創建工具子類化 BaseTool如何創建異步工具處理工具錯誤返回工具執行的artifact 使用內置工具和工具包自定義默認工具如何使用內置工具包 使用聊天模型調用工具定義工具模式Python 函數LangChain 工具Pydanti…

UiAutomator2 與 Appium 對比分析:安卓自動化測試框架的選擇指南

目錄 一、基礎介紹UiAutomator2Appium 二、功能對比三、架構差異UiAutomator2 架構簡圖:Appium 架構簡圖: 四、使用場景分析五、優缺點總結UiAutomator2 優點:UiAutomator2 缺點:Appium 優點:Appium 缺點: …

缺失的第一個正整數

繼續每日一題 今天給大家帶來一道將數組視為哈希表的算法 題目描述: 給你一個未排序的整數數組 nums ,請你找出其中沒有出現的最小的正整數。 請你實現時間復雜度為 O(n) 并且只使用常數級別額外空間的解決方案。 題目示例: 由于題目要求…

單例模式-Python示例

單例模式 單例模式(Singleton Pattern)是設計模式中一種創建型模式,廣泛應用于軟件開發中。一以下以故事化的方式,結合詳細的技術講解,介紹單例模式的背景、定義、適用場景,并提供python的示例代碼。 故事…

啥是 SaaS

https://www.youtube.com/watch?vnpcL7oRZQlI這個視頻講了什么東西, 什么 idea?好的,這個視頻內容非常棒,信息量很足。下面為你詳細總結視頻講了什么,以及核心的 Idea 是什么。 視頻核心 Idea 這個視頻講的是一位名叫 Leandro…

Spring Boot 工程啟動以后,我希望將數據庫中已有的固定內容,打入到 Redis 緩存中,請問如何處理?

在 Spring Boot 工程中,將數據庫中的固定內容預先加載到 Redis 緩存中可以通過以下步驟實現。這里假設你已經配置好了 Spring Data Redis 和數據庫(如 MySQL)的連接。 1. 添加依賴 首先,確保你的 pom.xml(Maven&…

springboot企業級項目開發之項目測試——集成測試!

集成測試 集成測試是指項目代碼在單元測試完成后進行的第二階段測試。集成測試的重點是在集成組件或單元之間交互時暴露缺陷,以保證不同模塊之間相互調用的正確性。在Spring Boot的項目集成測試中,將測試Controller和Dao的完整請求處理。應用程序在服務…

HTML 媒體(Media)

HTML 媒體(Media) 引言 HTML 媒體元素是構成現代網頁的重要組成部分,它允許我們在網頁中嵌入各種類型的媒體內容,如音頻、視頻、圖像等。這些元素不僅豐富了網頁的視覺效果,還提升了用戶體驗。本文將詳細介紹 HTML 媒…

輕量化分布式AGI架構:基于區塊鏈構建終端神經元節點的互聯網智腦

一、架構概述 該架構通過將終端設備(如手機、IoT設備)轉化為神經元節點,結合區塊鏈技術構建去中心化智能網絡,形成“互聯網智腦”。其核心在于突破傳統AGI算力瓶頸,實現數據安全共享與價值分配。 1.1 關鍵特征 分布…

【知識圖譜構建系列6】:借了張顯卡先跑著

文章目錄 前情提要mistral模型運行代碼前情提要 之前咱對LLM4KGC的代碼稍作修改,目標是用modelscope來下載模型。 現在這個代碼終于能跑了。 前面咱說,我們的顯卡只有6G的顯存。現在呢,我也成功借到了A100的顯卡。這下,咱可以先跑跑這個項目默認帶的mistral模型。 mist…

從零開始手寫redis(16)實現漸進式 rehash map

手寫 Redis 系列 java從零手寫實現redis(一)如何實現固定大小的緩存? java從零手寫實現redis(三)redis expire 過期原理 java從零手寫實現redis(三)內存數據如何重啟不丟失? jav…

List、Queue、Deque、Stack常用方法總結

Java 中幾個常見的線性數據結構的 方法總結與對比,包括: List(ArrayList、LinkedList)Queue(LinkedList、PriorityQueue)Deque(ArrayDeque、LinkedList)Stack(傳統 Stac…

github為InfiniSynapse Docker提PR過程留檔@Windows10

為InfiniSynapse Docker提了一個PR:修改阿里源為清華源,并不再安裝PPA。 by skywalk163 Pull Request #1 chaozwn/infini_docker 整體操作 提PR的前置動作 先fork要提PR的項目git clone到本地用VSCode修改代碼 提交PR git add . git commit -m &…