MongoDB 的索引是提高查詢性能的核心機制,類似于傳統關系型數據庫的索引。以下是對 MongoDB 索引的詳細說明:

MongoDB 的索引是提高查詢性能的核心機制,類似于傳統關系型數據庫的索引。以下是對 MongoDB 索引的詳細說明:

一、索引基礎
1. 索引的作用
加速查詢:通過索引快速定位數據,避免全集合掃描(COLLSCAN)。

排序優化:索引可以加速排序操作(如 sort())。

唯一性約束:通過唯一索引(unique: true)確保字段值不重復。

稀疏性控制:稀疏索引(sparse: true)僅對存在該字段的文檔創建索引。

2. 默認索引
MongoDB 自動為 _id 字段創建唯一索引,不可刪除。

二、索引類型
1. 單字段索引(Single Field Index)
對單個字段創建索引:

javascript
復制
db.collection.createIndex({ field: 1 }) ?// 1 表示升序,-1 表示降序
適用于精確匹配或范圍查詢的字段。

2. 復合索引(Compound Index)
對多個字段聯合創建索引:

javascript
復制
db.collection.createIndex({ field1: 1, field2: -1 })
字段順序重要:查詢條件中字段的順序需與索引一致或前綴匹配。

排序優化:索引字段的順序會影響 sort() 的性能。

3. 多鍵索引(Multikey Index)
自動為數組字段中的每個元素創建索引:

javascript
復制
db.collection.createIndex({ arrayField: 1 })
適用于查詢數組中的元素(如 arrayField: value)。

4. 文本索引(Text Index)
支持全文搜索:

javascript
復制
db.collection.createIndex({ content: "text" })
支持多字段聯合文本索引:

javascript
復制
db.collection.createIndex({ title: "text", description: "text" })
5. 地理空間索引(Geospatial Index)
2dsphere:支持球面幾何查詢(如經緯度):

javascript
復制
db.places.createIndex({ location: "2dsphere" })
2d:支持平面幾何查詢(適用于舊版本)。

6. 哈希索引(Hashed Index)
對字段值計算哈希后創建索引,常用于分片鍵:

javascript
復制
db.collection.createIndex({ field: "hashed" })
7. TTL 索引(Time-To-Live Index)
自動刪除過期文檔(如日志數據):

javascript
復制
db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })
8. 唯一索引(Unique Index)
確保字段值唯一:

javascript
復制
db.users.createIndex({ email: 1 }, { unique: true })
9. 稀疏索引(Sparse Index)
僅索引包含該字段的文檔:

javascript
復制
db.users.createIndex({ phone: 1 }, { sparse: true })
三、索引管理
1. 查看索引
javascript
復制
db.collection.getIndexes() ?// 查看集合的所有索引
2. 刪除索引
javascript
復制
db.collection.dropIndex("indexName") ?// 刪除指定索引
db.collection.dropIndexes() ? ? ? ? ? // 刪除所有索引(保留 _id 索引)
3. 重建索引
javascript
復制
db.collection.reIndex() ?// 重建所有索引(慎用,可能阻塞操作)
四、索引使用策略
1. 索引選擇
MongoDB 查詢優化器會自動選擇最優索引。

可通過 explain() 分析查詢執行計劃:

javascript
復制
db.collection.find({ field: "value" }).explain("executionStats")
2. 覆蓋查詢(Covered Query)
如果查詢結果完全由索引字段提供,無需回表查文檔:

javascript
復制
// 創建復合索引
db.users.createIndex({ name: 1, age: 1 })
// 覆蓋查詢示例
db.users.find({ name: "Alice" }, { _id: 0, name: 1, age: 1 })
3. 索引交集(Index Intersection)
MongoDB 可以將多個索引的結果合并,但通常復合索引更高效。

五、索引的限制與注意事項
內存占用:

索引存儲在內存中,大集合的索引可能占用較多內存。

寫操作開銷:

索引會降低插入、更新、刪除操作的性能。

索引鍵大小限制:

索引鍵(Index Key)的總大小不能超過 1024 字節。

查詢模式匹配:

某些查詢可能無法使用索引(如正則表達式未左錨定)。

六、最佳實踐
優先使用復合索引:避免創建過多單字段索引。

避免全集合掃描:對高頻查詢字段建立索引。

索引選擇性:高基數(唯一值多)的字段更適合建索引。

監控索引使用:

javascript
復制
db.collection.aggregate([{ $indexStats: {} }])
刪除冗余索引:定期清理未使用的索引。

示例場景
場景 1:查詢優化
javascript
復制
// 創建復合索引
db.orders.createIndex({ customerId: 1, orderDate: -1 })

// 查詢最近訂單
db.orders.find({ customerId: 123 }).sort({ orderDate: -1 })
場景 2:唯一約束
javascript
復制
// 確保用戶名唯一
db.users.createIndex({ username: 1 }, { unique: true })
通過合理設計索引,可以顯著提升 MongoDB 的查詢性能,但需根據實際場景權衡讀寫開銷。

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

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

相關文章

深入理解指針(1)(C語言版)

文章目錄 前言一、內存和地址1.1 內存1.2 究竟該如何理解編址 二、指針變量和地址2.1 取地址操作符&2.2 指針變量和解引用操作符*2.2.1 指針變量2.2.2 如何拆解指針類型2.2.3 解引用操作符 2.3 指針變量的大小 三、指針變量類型的意義3.1 指針的解引用3.2 指針-整數3.3 voi…

【視頻】m3u8相關操作

【視頻】郭老二博文之:圖像視頻匯總 1、視頻文件轉m3u8 1.1 常用命令 1)默認只保留 5 個ts文件 ffmpeg -i input.mp4 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls stream1.m3u82)去掉音頻 -an,保留全部ts文件 ffmpeg -i input.mp4 -vf scale=640:480 -an -…

AWS CloudWatch 實戰:構建智能監控與自動化運維體系

摘要:本文通過實際案例,詳細講解如何利用AWS CloudWatch實現云端資源的實時監控、日志分析與自動化運維,助力企業提升系統穩定性與運維效率 一、場景痛點分析 某電商平臺遷移至AWS后面臨三大挑戰: 故障響應滯后:服務器…

第一天學爬蟲

閱讀提示:我今天才開始嘗試爬蟲,寫的不好請見諒。 一、準備工具 requests庫:發送HTTP請求并獲取網頁內容。BeautifulSoup庫:解析HTML頁面并提取數據。pandas庫:保存抓取到的數據到CSV文件中。 二、爬取步驟 發送請求…

網絡編程和計算機網絡五層模型的關系

計算機網絡的五層模型(應用層、傳輸層、網絡層、鏈路層和物理層)為網絡編程提供了基礎框架和通信機制。網絡編程就是在這些層次上實現應用程序之間的通信。 計算機網絡五層模型 (1)應用層: 作用:應用層是…

知識篇 | Oracle的 TEMP表空間管理和優化

Oracle臨時表空間(TEMP)是數據庫中用于存儲會話級臨時數據的核心組件,主要用于支持需要中間結果集的操作(如排序、哈希連接)。其數據在事務結束或會話終止后自動釋放,不持久化存儲。 核心特點:…

重學Java基礎篇—線程池參數優化指南

一、核心參數解析 線程池(ThreadPoolExecutor)的性能取決于以下關鍵參數: 參數說明corePoolSize核心線程數,即使空閑也不會被回收maximumPoolSize最大線程數,當隊列滿且核心線程忙時創建新線程workQueue任務隊列&…

記一次線上環境JAR沖突導致程序報錯org.springframework.web.util.NestedServletException

一、問題描述 有個文件導入功能,用到了Hutool 的加密解密功能,本地運行完全可以,但是線上報錯:“org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFou…

怎么快速部署Sock5代理到ubuntu云服務器

使用 Dante (推薦) 1. 安裝 Dante bash Copy sudo apt update sudo apt install dante-server -y 2. 配置 Dante 編輯配置文件 /etc/danted.conf: bash Copy sudo nano /etc/danted.conf 替換為以下內容(按需修改端口和認證)&#…

華為OD機試2025A卷 - 游戲分組/王者榮耀(Java Python JS C++ C )

最新華為OD機試 真題目錄:點擊查看目錄 華為OD面試真題精選:點擊立即查看 題目描述 2020年題: 英雄聯盟是一款十分火熱的對戰類游戲。每一場對戰有10位玩家參與,分為兩組,每組5人。每位玩家都有一個戰斗力,代表著這位玩家的厲害程度。為了對戰盡可能精彩,我們需要…

OpenRAND可重復的隨機數生成庫

OpenRAND 是一個 C++ 庫,旨在通過提供強大且可復制的隨機數生成解決方案來促進可重復的科學研究。它是一個簡單的僅頭文件庫,性能可移植,統計穩健,并且易于集成到任何 HPC 計算項目中。 特征 跨平臺支持:OpenRAND 旨在跨各種平臺無縫工作,包括 CPU 和 GPU。其僅標題庫設計…

接口/UI自動化面試題

一、UI自動化 1.1、接口和UI自動化有多少用例? 回答策略:根據接口設定用例,100個接口,自動化case在1500-2000左右。結合自身的項目,回答覆蓋的主功能流程。 示例: 接口自動化的測試case一般需要根據接口數…

使用Docker部署RabbitMQ

第一步:安裝 RabbitMQ # 1. 拉取鏡像 docker pull rabbitmq:3.12.0-management# 2. 啟動容器(開放端口 數據持久化) docker run -d \--nameshare_rabbitmq \-p 5672:5672 \ # AMQP 協議端口-p 15672:15672 \ # 管理界面端口…

2.基于多線程的TCP服務器實現

目錄 1. 簡單分析之前的代碼 2. 多線程服務器設計 2.1 C11線程的基本使用 2.2 服務器主體邏輯 3. 錯誤處理的封裝 4. 完整的代碼實現 客戶端代碼(client.cpp) 服務器代碼(server.cpp) 5. 運行方式 在我們預想中&#xff…

Python Web 框架 Django、Flask 和 FastAPI 對比

在探索 Python Web 框架時,Django、Flask 和 FastAPI 無疑是最常被提及的名字。根據我們最新的 Python 開發者調查,這三大框架繼續穩坐后端 Web 開發的熱門寶座。它們均為開源項目,并且與 Python 的最新版本無縫兼容。然而,面對不…

SQL Server數據庫表刪除分區

在 SQL Server 中刪除分區并將表恢復到非分區狀態,需按以下步驟操作: 一、合并所有分區 1. 檢查現有分區結構 首先確認表的分區方案和分區函數: -- 查看分區方案 SELECT * FROM sys.partition_schemes;-- 查看分區函數 SELECT * FROM sys…

信息安全和病毒防護——安全協議關于SSL和TLS協議的補充說明

文章目錄 SSL與TLS的關系SSL與TLS的核心區別SSL/TLS的典型應用安全建議總結SSL與TLS的關系 SSL(Secure Sockets Layer,安全套接層)和TLS(Transport Layer Security,傳輸層安全)是同一技術體系的演進版本,而非完全獨立的協議。其發展歷程如下: SSL 1.0(1994):未公開…

[原創](Modern C++)現代C++的關鍵性概念: 多維數組的下標引用.

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、C …

從零構建大語言模型全棧開發指南:第二部分:模型架構設計與實現-2.2.3實戰案例:在筆記本電腦上運行輕量級LLM

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 實戰案例:在筆記本電腦上運行輕量級LLM2.2.3 模型架構設計與實現1. 環境與工具準備1.1 硬件要求1.2 軟件棧選擇2. 輕量級模型架構設計2.1 模型參數配置2.2 關鍵技術優化3. 實戰流程3.1 數據準備流程3.2…

工業軟件的破局與重構:從技術依賴到自主創新的未來路徑

工業軟件作為現代工業的“神經與大腦”,不僅是制造業數字化轉型的核心工具,更是國家工業競爭力的戰略制高點。近年來,中國工業軟件市場在政策驅動與技術迭代中迅猛發展,但核心技術受制于人的困境仍待突破。如何實現從“跟跑”到“…