目錄
索引原理
索引類型
單鍵索引
組合索引
特性索引
唯一索引
稀疏索引
部分索引?
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? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?顯示所有候選計劃的執行信息
這個方法會返回查詢語句使用的是那個索引、查詢時間、掃描文檔數量等常見信息可以作為索引優化的依據