MongoDB索引及其原理

目錄

索引原理

索引類型

單鍵索引

組合索引

特性索引

唯一索引

稀疏索引

部分索引?

TTL索引

多鍵索引

文本索引

地理空間索引

哈希索引

總結

MongoDB 索引執行計劃


索引原理

MongoDB索引的背后的原理和MySQL中的索引原理是差不多的,都是使用B+數來對數據進行管理

索引的運行機制也和MySQL是一樣的,也會有回表、覆蓋索引這些概念

首先,我們需要知道MongoDB的文檔本質上就是一個json對象

B+樹中葉子節點在MySQL中存的是行數據,在MongoDB中存儲的是文檔的指針,本質上是一樣的

所以,在理解MongoDB索引的原理上,我們可以把MySQL的行類比MongoDB的文檔來進行理解,其他都是基本一樣的

區別

????????MongoDB是自己創建好默認的以_id字段為主鍵索引,不能指定主鍵字段

? ? ? ? 和MySQL中的索引類型不太一樣

下面我將介紹MongoDB中的索引類型,類比MySQL數據庫知識進行分享

索引類型

索引大類是分為單鍵索引和組合索引兩大類

通過索引的特性來進行區分,這類叫做特性索引,這些特性索引是和單鍵索引和組合索引進行組合的

從而形成了各式各樣的索引

單鍵索引

對文檔中的單個字段創建索引

作用

????????加速對單個字段的查詢操作
????????支持排序操作
????????提高聚合操作的性能

# 創建單鍵的升序索引
db.集合名.createIndex({ 索引字段: 1 })# 創建單鍵的降序索引
db.集合名.createIndex({ 索引字段: -1 })

組合索引

對文檔中的多個字段創建索引

作用

? ? ? ??加速多字段查詢

????????優化排序操作

????????支持范圍查詢與等值查詢的混合優化

????????減少索引數量

# 創建組合索引
# 1 升序   -1 降序
db.集合名.createIndex({ 索引字段1: 1, 索引字段2: -1, 索引字段3: 1 , ...});

特性索引

唯一索引

定義:唯一索引用于保證字段的唯一性,防止插入重復的數據。

# {unique:true}保證了索引的特性是唯一的
# 索引字段 1 升序   -1 降序
db.集合名稱.createIndex({索引字段:1}, {unique:true})

稀疏索引

定義: 稀疏索引僅包含具有索引字段的文檔的條目,跳過沒有索引字段的文檔。

# {sparse:true}保證了索引的特性是稀疏索引
# 索引字段 1 升序   -1 降序
db.集合名稱.createIndex({索引字段:1}, {sparse:true})

部分索引?

定義: 部分索引僅索引符合特定過濾表達式的文檔,減少索引的存儲要求和創建維護成本。

# {partialFilterExpression:{查詢操作符}}保證了索引的特性是部分索引
# 查詢操作符就是為了過濾符合條件的數據建立索引
# 索引字段 1 升序   -1 降序
db.集合名稱.createIndex({索引字段:1}, {partialFilterExpression:{查詢操作符}})

TTL索引

定義:TTL索引允許在指定時間后自動從集合中刪除文檔,適用于需要自動過期數據的場景。

# {expireAfterSeconds:存活時間秒級}保證了索引的特性是TTL索引
# 索引字段 1 升序   -1 降序
db.集合名稱.createIndex({索引字段:1}, {expireAfterSeconds:存活時間秒級})

多鍵索引

定義:多鍵索引是在數組字段上創建的索引,MongoDB會為數組的每個元素創建單獨的索引條目。適用于需要查詢數組中特定元素的場景。

# 索引數組字段 1 升序   -1 降序
db.集合名.createIndex({ 索引數組字段: -1 })

文本索引

定義:文本索引用于支持全文搜索,可以快速定位包含指定關鍵詞的文檔。適用于需要進行全文搜索的場景,如博客文章、商品描述等。一個集合最多支持一個文本索引。

# 索引字段鍵值對值為text,說明這個是一個全文索引
db.集合名.createIndex({ 索引字段: "text" })

地理空間索引

定義:地理空間索引用于支持地理空間數據查詢,可以快速定位地理位置附近的文檔。適用于需要根據地理位置進行查詢的場景,如查找附近的商家、地點等。

# 索引字段鍵值對值為2dsphere,說明這個是一個地理位置索引
db.集合名.createIndex({ 索引字段: "2dsphere" })

哈希索引

定義:哈希索引將字段的值通過哈希算法轉換為哈希值,并在哈希值上建立索引。適用于需要對字段進行哈希查找的場景,如分片集群中的哈希分片。哈希索引不支持范圍查詢。

# 索引字段鍵值對值為hashed,說明這個是一個哈希索引
db.集合名.createIndex({ 索引字段: "hashed" })

總結

上面的特性索引的語法都是按照單鍵索引類型來進行舉例的

按照組合索引類型的特性索引語法就是多填入幾個索引字段

具體問題具體分析,特性索引是和單鍵、組合索引是可以相互配合使用的

MongoDB 索引執行計劃

在 MongoDB 中查看索引執行計劃通過?explain()?方法來實現的

查詢語句的末尾調用.explain()方法就可以看到這個查詢語句的索引執行計劃

和MySQL差不多

MongoDB中的explain()方法是有參數控制的

queryPlanner? ? ? ? ? ? ? ? ? ?(默認)? ? ? ? ? 顯示查詢計劃選擇過程
executionStats? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???包含查詢計劃選擇和執行統計信息
allPlansExecution? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?顯示所有候選計劃的執行信息

這個方法會返回查詢語句使用的是那個索引、查詢時間、掃描文檔數量等常見信息可以作為索引優化的依據

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

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

相關文章

學習嵌入式的第三十三天-數據結構-(2025.7.25)服務器/多客戶端模型

服務器/多客戶端模型循環服務器 while(1){ accept(); recv(); } 適用于簡單任務,如基礎Web服務器,但無法處理并發請求。并發服務器 通過thread或fork實現多任務處理。需注意子進程/線程的資源回收,避免內存泄漏。多路IO模型服務器 使用select…

【Canvas與標牌】優質資產六角星標牌

【成圖】【代碼】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>優質資產六角星標記 Draft1</title><style type"text/cs…

掃雷游戲開發教程:從零打造精美像素掃雷

完整源碼在本文結尾處一、游戲概述 掃雷是一款經典的益智游戲&#xff0c;玩家需要在不觸發地雷的情況下揭開所有安全格子。本教程將帶你從零開始開發一個具有精美界面和動畫效果的掃雷游戲&#xff0c;包含難度選擇、棋盤大小調整等高級功能。 二、游戲核心功能 三種難度級別&…

Linux驅動開發筆記(五)——設備樹(上)

內容詳見《【正點原子】I.MX6U嵌入式Linux驅動開發指南》四十三章 開發板&#xff1a;imx6ull mini 虛擬機&#xff1a;VMware17 ubuntu&#xff1a;ubuntu20.04 一、什么是設備樹 視頻&#xff1a;第6.1講 Linux設備樹詳解-什么是設備樹&#xff1f;_嗶哩嗶哩_bilibili 對…

【QT入門到晉級】window opencv安裝及引入qtcreator(包含兩種qt編譯器:MSVC和MinGW)

前言 本文主要分享QT的兩種編譯器環境&#xff08;MSVC和MinGW&#xff09;下&#xff0c;安裝及引入opencv的方法。 編譯器區別 特性????MSVC????MinGW????編譯器類型??微軟專有編譯器&#xff08;cl.exe&#xff09;基于GCC的開源工具鏈??平臺支持??僅Wi…

字節跳動Coze Studio開源了!架構解析

Coze Studio 是字節跳動推出的一款 AI 應用開發平臺&#xff0c;專注于幫助開發者快速構建、測試和部署基于大語言模型的智能應用。其整體架構圍繞“低代碼開發 AI 應用”的核心目標設計&#xff0c;融合了模型能力、工具集成、流程編排和多端部署等功能。以下是其整體架構的詳…

Claude 4.0 終極編程指南:模型對比、API配置與IDE集成實戰

Claude 4.0 終極編程指南&#xff1a;模型對比、API配置與IDE集成實戰 基于官方文檔及可驗證數據源&#xff08;2025年7月更新&#xff09; 1 Claude 4.0 技術解析&#xff1a;對比競品的核心優勢與局限 1.1 官方性能數據&#xff08;來源&#xff1a;Anthropic技術白皮書&…

優化:Toc小程序猜你喜歡功能

引言&#xff1a;來自自創的小程序中熱點接口&#xff0c;本小程序專為在校學生自提點餐使用 一、功能描述 該功能作為一個推薦的職責&#xff0c;根據用戶最近行為給用戶推薦用戶可能喜歡去吃的店鋪&#xff0c;可能比較簡潔&#xff0c;但是需要設計的方面挺多的&#xff0c…

Datawhale AI 夏令營:讓AI理解列車排期表 Notebook(Baseline拆解)

Step1、讀取數據 import pandas as pd import requests import re import json from tqdm import tqdm# 讀取數據 data pd.read_excel(data/info_table.xlsx) data data.fillna(無數據) dataStep2、注冊硅基流動https://cloud.siliconflow.cnQwen/Qwen3-8B 模型可以免費使用&…

vue寫的app設置角標

原生App角標&#xff08;UniApp示例&#xff09;調用plus.runtime.setBadgeNumber方法設置安卓/iOS角標&#xff1a;javascriptCopy Code// 設置角標 plus.runtime.setBadgeNumber(99); // 清除角標&#xff08;部分平臺需特殊處理&#xff09; plus.runtime.setBadgeNumber(0)…

GAN/cGAN中到底要不要注入噪聲

MelGAN論文MelGAN針對的是從mel譜生成語音&#xff0c;里面說當條件很強的時候&#xff0c;隨機噪聲就沒啥用了&#xff0c;因此沒將noise注入到生成器中&#xff1b;運用的判別器也僅有1個輸入&#xff0c;不是cGAN的形式image-to-image translation with conditional adversa…

備份一下我的 mac mini 的環境變量配置情況

export PATH“/opt/homebrew/bin:$PATH” #THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!! export SDKMAN_DIR“HOME/.sdkman"[[?s"HOME/.sdkman" [[ -s "HOME/.sdkman"[[?s"HOME/.sdkman/bin/sdkman-init.sh” ]] && so…

JVM學習日記(十)Day10

G1回收器 這一篇是詳細說明G1回收器的&#xff0c;因為他相對來說確實是個縫合怪&#xff0c;上篇的內容又太多了所不清楚&#xff0c;所有這一篇進行詳細的說明&#xff0c; 第一個呢就是其實G1是兼顧并行和并發的&#xff0c;簡單來說就是既可以并行也可以并發&#xff0c;…

使用IP掃描工具排查網絡問題

隨著企業的發展&#xff0c;網絡中會新增各類設備&#xff0c;從臺式機、服務器到物聯網設備和虛擬機&#xff08;VMs&#xff09;&#xff0c;所有這些設備都通過復雜的子網和虛擬局域網&#xff08;VLAN&#xff09;相連。 這種復雜性給 IT 團隊帶來了壓力&#xff0c;他們需…

Wireshark TS | 發送數據超出接收窗口

前言 來自于測試中無意發現到的一個接收窗口滿的案例&#xff0c;特殊&#xff0c;或者可以說我以前都沒在實際場景中見過。一開始都沒整太明白&#xff0c;花了些精力才算是弄清楚了些&#xff0c;記錄分享下。 問題說明 在研究擁塞控制的慢啟動階段時&#xff0c;通過 packet…

C語言自定義數據類型詳解(四)——聯合體

好的&#xff0c;接下來我們來學習最后一個自定義數據類型——聯合體。 一、什么是聯合體&#xff1a; 聯合體又叫共用體&#xff0c;用關鍵字union來進行定義。又因為所有的成員變量共用同一段內存空間&#xff08;關于這一點&#xff0c;我們不久就會加以驗證&#xff09;&…

[python][flask]Flask-Login 使用詳解

1. 簡介Flask-Login 是 Flask 的一個擴展&#xff0c;專門用于處理用戶認證相關的功能。它提供了用戶會話管理、登錄/注銷視圖、記住我功能等常見認證需求&#xff0c;讓開發者能夠快速實現安全的用戶認證系統。2. 安裝與基礎配置首先&#xff0c;需要安裝 Flask-Login&#xf…

【WebGPU學習雜記】WebAssembly中的relaxed_madd指令到底做了什么?

relaxed_madd 這條指令到底做了什么核心&#xff1a;relaxed_madd 是一個分量級別 (Component-wise) 的操作 首先&#xff0c;最重要的一點是&#xff1a;v128.relaxed_madd<f32>(a, b, c) 不是矩陣乘法。它是一個在三個向量 a, b, c 之間進行的、逐個分量的、并行的融合…

【全新上線】境內 Docker 鏡像狀態監控

境內 Docker 鏡像狀態監控&#xff1a;您的 Docker 加速伴侶 在當今云計算和容器化技術飛速發展的時代&#xff0c;Docker 已成為開發者不可或缺的工具。然而&#xff0c;對于身處國內的用戶而言&#xff0c;訪問境外 Docker Hub 等鏡像倉庫時常會遭遇網絡延遲和連接不穩定的困…

Visual Studio中部署PaddleOCRv5 (借助ncnn框架)

PaddleOCRv5_ncnn PaddleOCRv5 在Visual Studio中進行圖片OCR檢測&#xff08;ncnn框架open-mobile實現)&#xff0c;嘗試對nihui的ncnn-android-ppocrv5檢測算法的剝離與移植。 本項目Github鏈接如下&#xff1a;PaddleOCRv5_ncnn 寫在前面 本倉庫代碼是基于nihui的ncnn-a…