MongoDB 索引是提升查詢效能的關鍵機制。理解不同索引型別並正確設定,能有效降低查詢延遲。本文從單一欄位索引、複合索引到多鍵索引和全文檢索的文字索引,皆提供對應的建立方法與程式碼範例。此外,針對特殊的使用情境,也說明瞭唯一索引、部分索引和稀疏索引的建立方式,以及如何利用 TTL 索引自動刪除過期資料。最後,文章也涵蓋瞭如何檢視現有索引和刪除不再需要的索引,提供全面的索引管理策略。

MongoDB 索引建立與應用詳解

MongoDB 是一種流行的 NoSQL 資料函式庫,其高效能的資料檢索能力與索引機制密不可分。本文將探討 MongoDB 中的索引型別、建立方法及其屬性,並透過例項程式碼詳細解析其應用。

建立索引的基本方法

在 MongoDB 中,建立索引主要透過 db.collection.createIndex() 方法實作。此方法的基本語法結構如下:

db.collection.createIndex(<key 和索引型別>, <選項>)
  • key:指定要建立索引的欄位名稱。
  • 索引型別:通常為 1(升冪)或 -1(降冪),定義了索引的排序方式。
  • 選項:可選引數,用於設定索引的其他屬性。

範例:建立單一欄位索引

假設我們有一個名為 BPBOnlineBooksCollectionWithIndex 的集合,並希望在 Title 欄位上以升冪順序建立索引,可以使用以下程式碼:

db.BPBOnlineBooksCollectionWithIndex.createIndex({ Title: 1 });

內容解密:

  1. db.BPBOnlineBooksCollectionWithIndex:指定要操作的集合。
  2. createIndex():建立索引的方法。
  3. { 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 中的 TypeQuantity 建立聯合升冪索引,便於查詢庫存相關資訊。

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 }
);

內容解密:

  1. createIndex() 方法用於在指定的集合上建立索引。
  2. { ISBN: 1 } 表示在 ISBN 欄位上建立升序索引。
  3. { sparse: true } 引數使得該索引成為稀疏索引,只對具有 ISBN 欄位的資料進行索引。

TTL 索引(Time To Live Index)

TTL 索參照於自動刪除過期的資料,適合用於儲存臨時資料的場景,如機器日誌、事件資料或會話資訊。建立 TTL 索引的範例如下:

db.BPBOnlineBooksCollectionWithIndex.createIndex(
  { SpecialOfferDiscount: 1 },
  { expireAfterSeconds: 604800 }
);

內容解密:

  1. SpecialOfferDiscount 欄位上建立升序索引。
  2. expireAfterSeconds: 604800 設定資料在 604800 秒(7天)後自動刪除。

使用索引

建立索引後,可以利用 find()sort() 方法來使用索引,提升查詢和排序的效率。

db.BPBOnlineBooksCollectionWithIndex.createIndex({ Title: 1, Year: 1 });
db.BPBOnlineBooksCollectionWithIndex.find().sort({ Title: 1, Year: 1 }).pretty();

內容解密:

  1. TitleYear 欄位上建立複合索引。
  2. 使用 find() 方法查詢資料,並透過 sort() 方法根據索引欄位進行排序。

索引與校對(Collation)

校對(Collation)允許在建立索引時指定語言特定的排序規則,這對於處理具有特殊字元的語言尤其重要。

db.BPBOnlineBooksCollectionWithIndex.createIndex(
  { Title: 1, Tags: 1 },
  { collation: { locale: "en_US" } }
);

內容解密:

  1. TitleTags 欄位上建立複合索引。
  2. 使用 collation 引數指定地區為 “en_US”,以支援英文(美國)的排序規則。

檢視索引資訊

可以使用 getIndexes() 方法來檢視集合中已建立的索引。

db.BPBOnlineBooksCollectionWithIndex.getIndexes();

內容解密:

  1. getIndexes() 方法傳回集合中所有索引的詳細資訊。

刪除索引

當不再需要某個索引時,可以使用 dropIndex()dropIndexes() 方法來刪除它。

db.BPBOnlineBooksCollectionWithIndex.dropIndex({ Title: 1 });
db.BPBOnlineBooksCollectionWithIndex.dropIndexes(["Title_1_Tags_1", "ISBN_1"]);

內容解密:

  1. dropIndex() 方法用於刪除指定的單一索引。
  2. 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 } 表示對 titleauthor 欄位建立複合升序索引。
  • { 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() 方法可以刪除索引。

練習題

  1. MongoDB 中預設的 _id 索引型別是什麼?

    • a. 字串(String)
    • b. 整數(Integer)
    • c. 物件 ID(ObjectId)
    • d. 以上皆非

    答案:c. 物件 ID(ObjectId)

  2. 在 MongoDB 中,如何建立索引?

    • a. db.collection.addIndex()
    • b. db.collection.createIndex()
    • c. db.collection.Index()
    • d. db.collection.newIndex()

    答案:b. db.collection.createIndex()

  3. 如何刪除集合中的所有索引?

    • a. db.collection.dropIndexes();
    • b. db.collection.deleteIndex();
    • c. db.collection.createIndex({Field1 : -1, Field2: -1});
    • d. db.collection.noIndex();

    答案:a. db.collection.dropIndexes();

問題與討論

  1. 什麼是索引?為什麼它是有用的?
  2. 請解釋 MongoDB 預設的 _id 索引及其屬性。
  3. 如何在 MongoDB 中建立索引?
  4. 列出三種不同的 MongoDB 索引型別。
  5. 列出兩種 MongoDB 索引屬性。
  6. 如何檢視集合中的現有索引?
  7. 列出刪除 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 });

內容解密:

  • 投影運算元用於指定查詢結果中要包含或排除的欄位。
  • 在此範例中,查詢結果只包含 titleprice 欄位。