MongoDB 索引是提升查詢效能的關鍵機制。理解不同索引型別並正確設定,能有效降低查詢延遲。本文從單一欄位索引、複合索引到多鍵索引和全文檢索的文字索引,皆提供對應的建立方法與程式碼範例。此外,針對特殊的使用情境,也說明瞭唯一索引、部分索引和稀疏索引的建立方式,以及如何利用 TTL 索引自動刪除過期資料。最後,文章也涵蓋瞭如何檢視現有索引和刪除不再需要的索引,提供全面的索引管理策略。
MongoDB 索引建立與應用詳解
MongoDB 是一種流行的 NoSQL 資料函式庫,其高效能的資料檢索能力與索引機制密不可分。本文將探討 MongoDB 中的索引型別、建立方法及其屬性,並透過例項程式碼詳細解析其應用。
建立索引的基本方法
在 MongoDB 中,建立索引主要透過 db.collection.createIndex() 方法實作。此方法的基本語法結構如下:
db.collection.createIndex(<key 和索引型別>, <選項>)
- key:指定要建立索引的欄位名稱。
- 索引型別:通常為 1(升冪)或 -1(降冪),定義了索引的排序方式。
- 選項:可選引數,用於設定索引的其他屬性。
範例:建立單一欄位索引
假設我們有一個名為 BPBOnlineBooksCollectionWithIndex 的集合,並希望在 Title 欄位上以升冪順序建立索引,可以使用以下程式碼:
db.BPBOnlineBooksCollectionWithIndex.createIndex({ Title: 1 });
內容解密:
db.BPBOnlineBooksCollectionWithIndex:指定要操作的集合。createIndex():建立索引的方法。{ Title: 1 }:定義索引的鍵為Title,並以升冪(1)排序。
MongoDB 中的索引型別
MongoDB 支援多種索引型別,以滿足不同的查詢需求。
1. 單一欄位索引
對單一欄位建立索引,適用於經常作為查詢條件的欄位。
db.BPBOnlineBooksCollectionWithIndex.createIndex({ Year: 1 });
內容解密:
- 對
Year欄位建立升冪索引,最佳化根據年份的查詢。
2. 複合索引
對多個欄位聯合建立索引,能有效提升複雜查詢的效能。
db.BPBOnlineBooksCollectionWithIndex.createIndex({ Title: 1, Year: -1 });
內容解密:
- 先按
Title升冪排序,再按Year降冪排序,適合需要同時依據標題和年份查詢的場景。
3. 多鍵索引
當欄位值為陣列時,MongoDB 自動為陣列中的每個元素建立索引。
db.BPBOnlineBooksCollectionWithIndex.createIndex({ "InStock.Type": 1, "InStock.Quantity": 1 });
內容解密:
- 對巢狀在
InStock中的Type和Quantity建立聯合升冪索引,便於查詢庫存相關資訊。
4. 文字索引
用於支援文字搜尋查詢,忽略停用詞(如 “a”, “an”, “the” 等)。
db.BPBOnlineBooksCollectionWithIndex.createIndex({ Title: "text" });
內容解密:
- 在
Title欄位上建立文字索引,支援全文檢索功能。
索引屬性
MongoDB 的索引支援多種屬性設定,以滿足不同應用場景的需求。
1. 唯一索引
確保被索引欄位的值唯一,不允許重複。
db.BPBOnlineBooksCollectionWithIndex.createIndex({ ISBN: 1 }, { unique: true });
內容解密:
- 對
ISBN建立唯一索引,保證每本文的 ISBN 號唯一。
2. 部分索引
僅對符合特定條件的檔案建立索引,節省儲存空間並提升效能。
db.BPBOnlineBooksCollectionWithIndex.createIndex({ Title: -1 }, { partialFilterExpression: { Year: "2019" } });
內容解密:
- 對
Year為 “2019” 的檔案,在Title欄位上建立降冪索引。
3. 稀疏索引
僅當檔案包含被索引欄位時才進行索引,否則忽略。
db.BPBOnlineBooksCollectionWithIndex.createIndex({ ISBN: 1 }, { sparse: true });
內容解密:
- 對存在
ISBN欄位的檔案建立升冪索引,不存在的則忽略。
MongoDB 索引管理詳解
MongoDB 的索引管理是資料函式庫效能最佳化的關鍵部分,正確使用索引可以大幅提升查詢效率。本文將探討 MongoDB 索引的建立、使用和管理。
建立特殊索引
在 MongoDB 中,除了基本的索引外,還有多種特殊索引可供使用,包括稀疏索引(Sparse Index)和 TTL 索引(Time To Live Index)。
稀疏索引(Sparse Index)
稀疏索引只會對存在特定欄位的資料建立索引,適合用於欄位存在率不高的集合。建立稀疏索引的範例如下:
db.BPBOnlineBooksCollectionWithIndex.createIndex(
{ ISBN: 1 },
{ sparse: true }
);
內容解密:
createIndex()方法用於在指定的集合上建立索引。{ ISBN: 1 }表示在ISBN欄位上建立升序索引。{ sparse: true }引數使得該索引成為稀疏索引,只對具有ISBN欄位的資料進行索引。
TTL 索引(Time To Live Index)
TTL 索參照於自動刪除過期的資料,適合用於儲存臨時資料的場景,如機器日誌、事件資料或會話資訊。建立 TTL 索引的範例如下:
db.BPBOnlineBooksCollectionWithIndex.createIndex(
{ SpecialOfferDiscount: 1 },
{ expireAfterSeconds: 604800 }
);
內容解密:
- 在
SpecialOfferDiscount欄位上建立升序索引。 expireAfterSeconds: 604800設定資料在 604800 秒(7天)後自動刪除。
使用索引
建立索引後,可以利用 find() 和 sort() 方法來使用索引,提升查詢和排序的效率。
db.BPBOnlineBooksCollectionWithIndex.createIndex({ Title: 1, Year: 1 });
db.BPBOnlineBooksCollectionWithIndex.find().sort({ Title: 1, Year: 1 }).pretty();
內容解密:
- 在
Title和Year欄位上建立複合索引。 - 使用
find()方法查詢資料,並透過sort()方法根據索引欄位進行排序。
索引與校對(Collation)
校對(Collation)允許在建立索引時指定語言特定的排序規則,這對於處理具有特殊字元的語言尤其重要。
db.BPBOnlineBooksCollectionWithIndex.createIndex(
{ Title: 1, Tags: 1 },
{ collation: { locale: "en_US" } }
);
內容解密:
- 在
Title和Tags欄位上建立複合索引。 - 使用
collation引數指定地區為 “en_US”,以支援英文(美國)的排序規則。
檢視索引資訊
可以使用 getIndexes() 方法來檢視集合中已建立的索引。
db.BPBOnlineBooksCollectionWithIndex.getIndexes();
內容解密:
getIndexes()方法傳回集合中所有索引的詳細資訊。
刪除索引
當不再需要某個索引時,可以使用 dropIndex() 或 dropIndexes() 方法來刪除它。
db.BPBOnlineBooksCollectionWithIndex.dropIndex({ Title: 1 });
db.BPBOnlineBooksCollectionWithIndex.dropIndexes(["Title_1_Tags_1", "ISBN_1"]);
內容解密:
dropIndex()方法用於刪除指定的單一索引。dropIndexes()方法用於刪除多個索引,可以傳入索引名稱的陣列來指定要刪除的索引。
綜上所述,MongoDB 的索引管理提供了豐富的功能,從基本的索引建立到特殊索引的使用,再到索引的維護和管理,每一步都對資料函式庫的效能和可擴充套件性有著重要影響。正確地使用和管理索引,是確保 MongoDB 資料函式庫高效執行的關鍵。
MongoDB 索引的建立、檢視與刪除
MongoDB 索引的基本概念
在前面的章節中,我們已經瞭解了 MongoDB 的基本操作和資料模型。在本章節中,我們將探討 MongoDB 的索引機制,包括索引的建立、檢視和刪除。
建立索引
在 MongoDB 中,索引是一種特殊的資料結構,可以提高查詢的效率。我們可以使用 createIndex() 方法來建立索引。
單一欄位索引
db.BPBOnlineBooksCollection.createIndex({ title: 1 });
複合索引
db.BPBOnlineBooksCollection.createIndex({ title: 1, author: 1 });
TTL 索引
db.BPBOnlineBooksCollection.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 });
內容解密:
createIndex()方法用於建立索引。{ title: 1 }表示對title欄位建立升序索引。{ title: 1, author: 1 }表示對title和author欄位建立複合升序索引。{ expireAfterSeconds: 3600 }表示設定 TTL 索引,檔案將在 3600 秒後自動刪除。
檢視索引
我們可以使用 getIndexes() 方法來檢視集合中的所有索引。
db.BPBOnlineBooksCollection.getIndexes();
內容解密:
getIndexes()方法用於檢視集合中的所有索引。- 傳回結果包括索引的名稱、鍵值和選項等資訊。
刪除索引
我們可以使用 dropIndex() 或 dropIndexes() 方法來刪除索引。
刪除單一索引
db.BPBOnlineBooksCollection.dropIndex({ title: 1 });
刪除多個索引
db.BPBOnlineBooksCollection.dropIndexes({ title: 1, author: 1 });
刪除所有索引
db.BPBOnlineBooksCollection.dropIndexes();
內容解密:
dropIndex()方法用於刪除單一索引。dropIndexes()方法用於刪除多個或所有索引。- 如果不指定任何引數,
dropIndexes()將刪除集合中的所有索引,除了預設的_id索引。
MongoDB 索引的限制
在使用 MongoDB 索引時,需要注意以下限制:
- 索引名稱的長度不能超過 128 個字元。
- 一個集合中最多可以有 64 個索引。
- 複合索引最多可以包含 31 個欄位。
- 如果索引的大小超過了記憶體的限制,MongoDB 可能會刪除部分索引,導致效能問題。
重點回顧
- 正確的索引可以顯著提高應用程式的效能。
- 在建立檔案時,MongoDB 會自動為
_id欄位建立索引。 - 使用
createIndex()方法可以建立索引。 - TTL 索引可以用於自動刪除過期的檔案。
- 使用
getIndexes()方法可以檢視集合中的所有索引。 - 使用
dropIndex()或dropIndexes()方法可以刪除索引。
練習題
MongoDB 中預設的
_id索引型別是什麼?- a. 字串(String)
- b. 整數(Integer)
- c. 物件 ID(ObjectId)
- d. 以上皆非
答案:c. 物件 ID(ObjectId)
在 MongoDB 中,如何建立索引?
- a. db.collection.addIndex()
- b. db.collection.createIndex()
- c. db.collection.Index()
- d. db.collection.newIndex()
答案:b. db.collection.createIndex()
如何刪除集合中的所有索引?
- a. db.collection.dropIndexes();
- b. db.collection.deleteIndex();
- c. db.collection.createIndex({Field1 : -1, Field2: -1});
- d. db.collection.noIndex();
答案:a. db.collection.dropIndexes();
問題與討論
- 什麼是索引?為什麼它是有用的?
- 請解釋 MongoDB 預設的
_id索引及其屬性。 - 如何在 MongoDB 中建立索引?
- 列出三種不同的 MongoDB 索引型別。
- 列出兩種 MongoDB 索引屬性。
- 如何檢視集合中的現有索引?
- 列出刪除 MongoDB 集合中索引的各種方法。
關鍵術語
- 索引(Indexes):資料函式倉管理系統中儲存資料的一種特殊資料結構,使得資料更容易被遍歷。
- 預設
_id索引(Default _id Index):在 MongoDB 中建立檔案時自動為_id欄位建立的索引,型別為 ObjectId。 - TTL(Time To Live):表示檔案在 MongoDB 中的存活時間,以秒為單位。### MongoDB 查詢選擇器
簡介
在查詢 MongoDB 資料函式庫時,我們需要根據不同的需求擷取特定的資料。MongoDB 提供了一系列查詢選擇器來滿足這些需求。本章節將介紹 MongoDB 的查詢選擇器,包括其基本概念、不同型別以及實際應用範例。
MongoDB 查詢選擇器的基本概念
MongoDB 的查詢選擇器是用於篩選和擷取資料函式庫中檔案的工具。透過使用不同的查詢運算元,我們可以根據特定的條件來查詢檔案。
圖表說明:此圖示呈現了 MongoDB 查詢選擇器的基本架構
不同型別的查詢選擇器
MongoDB 提供多種查詢選擇器,包括比較運算元、邏輯運算元、元素運算元等。
圖表說明:此圖示呈現了不同型別的查詢選擇器
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title MongoDB 索引建立應用與管理詳解
package "資料庫架構" {
package "應用層" {
component [連線池] as pool
component [ORM 框架] as orm
}
package "資料庫引擎" {
component [查詢解析器] as parser
component [優化器] as optimizer
component [執行引擎] as executor
}
package "儲存層" {
database [主資料庫] as master
database [讀取副本] as replica
database [快取層] as cache
}
}
pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中
master --> replica : 資料同步
note right of cache
Redis/Memcached
減少資料庫負載
end note
@enduml使用範例
以下是一些使用查詢選擇器的實際範例:
範例1:使用 $eq 比較運算元
db.BPBOnlineBooksCollection.find({ title: { $eq: "MongoDB Basics" } });
內容解密:
$eq用於匹配欄位值等於指定值的檔案。
範例2:使用 $and 邏輯運算元
db.BPBOnlineBooksCollection.find({ $and: [{ author: "John Doe" }, { price: { $gt: 20 } }] });
內容解密:
$and用於匹配多個條件都為真的檔案。- 在此範例中,查詢同時滿足作者是 “John Doe” 且價格大於20的檔案。
投影運算元
除了查詢選擇器外,MongoDB還提供了投影運算元,用於控制查詢結果中包含或排除的欄位。
範例:使用投影運算元
db.BPBOnlineBooksCollection.find({ author: "John Doe" }, { title: 1, price: 1 });
內容解密:
- 投影運算元用於指定查詢結果中要包含或排除的欄位。
- 在此範例中,查詢結果只包含
title和price欄位。