在文檔數據庫服務中,可以使用索引來加速查詢操作。索引是一個數據結構,它可以在集合中對指定的字段進行排序,并為這些字段創建一個快速查找的數據結構。文檔數據庫服務支持多種類型的索引,例如單字段索引、多字段聯合索引、全文索引等。
索引分類
-
單字段索引:單字段索引是最常見的索引類型,它基于集合中的單個字段進行排序和查找。
-
復合索引:復合索引是基于多個字段進行排序和查找的索引類型。復合索引可以包含多個字段,可以根據這些字段的順序指定索引鍵的排序方式。
-
多鍵索引:在文檔數據庫服務中,一個文檔可以包含多個值相同的數組或嵌套文檔,這些值可以被視為多個鍵。多鍵索引可以基于這些多個鍵對文檔進行排序和查找。下面是一個示例:
假設有一個集合 books,其中包含每本書的信息,其中一個字段 tags 是一個包含多個標簽的數組。例如:{ "_id" : ObjectId("6146c03f6c9d8f5fb9da0e3c"), "title" : "The Great Gatsby", "author" : "F. Scott Fitzgerald", "tags" : [ "Fiction", "Classic", "Romance" ] }為了加速對 tags 字段的查詢操作,可以在 tags 字段上創建一個多鍵索引。例如:
db.books.createIndex({ tags: 1 })這將在 tags 字段上創建一個升序的多鍵索引。
現在,可以使用以下查詢來查找包含特定標簽的書籍:
db.books.find({ tags: "Fiction" })這個查詢將使用 tags 字段上的多鍵索引來加速查詢,返回所有包含 "Fiction" 標簽的書籍。
需要注意的是,多鍵索引的效率可能受到數組字段中值的數量和類型的影響。如果數組字段中包含大量的值或嵌套文檔,則多鍵索引可能不是最佳選擇。在使用多鍵索引時,需要根據實際情況評估其效果和性能。
-
地理空間索引:地理空間索引是一種針對地理空間數據進行優化的索引類型,它可以加速針對地理空間數據的查詢和聚合操作。可以使用 createIndex() 命令創建地理空間索引。
-
文本索引:文本索引是一種針對文本數據進行優化的索引類型,它可以加速全文檢索操作。文本索引只能用于字符串字段。可以使用 createIndex() 命令創建文本索引。
-
散列索引:散列索引是一種基于哈希函數的索引類型,它可以加速散列鍵(如密碼)的查找操作。可以使用 createIndex() 命令創建散列索引。
-
TTL 索引:TTL 索引是一種基于時間戳的索引類型,它可以自動刪除滿足一定時間條件的文檔。可以使用 createIndex() 命令創建 TTL 索引。
索引名稱
索引的默認名稱是索引鍵和索引中每個鍵的方向(即1或-1)的連接,使用下劃線作為分隔符。例如,在 { item : 1, quantity: -1 }上創建的索引名稱為item1_quantity-1。
您可以創建具有自定義名稱的索引,比如比默認名稱更易于閱讀的索引。例如,考慮一個經常查詢products集合以填充現有庫存數據的應用程序。下面的createIndex() 方法在名為查詢的商品和數量上創建一個索引:
db.products.createIndex( { item: 1, quantity: -1 } , { name: "query for inventory" })
您可以使用 db.collection.getIndexes()方法查看索引名稱。一旦創建索引,您將無法重命名。相反,您必須刪除并使用新名稱重新創建索引。
文檔數據庫服務提供了許多不同的索引類型來支持特定類型的數據和查詢。
創建索引
在文檔數據庫服務中,可以使用 createIndex() 方法來創建索引。下面是創建索引的一般步驟:
- 連接到文檔數據庫服務的數據庫。
- 選擇要創建索引的集合。
- 使用 createIndex() 方法創建索引。createIndex() 方法接受兩個參數:
- 索引鍵(Index Keys):一個包含一個或多個字段的文檔,用于指定要在哪些字段上創建索引。可以使用對象字面量或字符串表示法指定索引鍵。
- 選項(Options):一個包含一個或多個選項的文檔,用于指定索引的屬性和行為。可以省略選項對象,使用默認值。
以下是一些常用的可選參數:- background:指定創建索引時是否在后臺運行。如果設置為 true,則創建索引的過程將在后臺運行,不會阻塞其他操作。默認值為 false。
- unique:指定索引是否唯一。如果設置為 true,則索引鍵值必須唯一。默認值為 false。
- sparse:指定索引是否稀疏。如果設置為 true,則只有包含索引鍵的文檔才會被索引。默認值為 false。
- name:指定索引的名稱。如果未指定名稱,則文檔數據庫服務將自動生成一個唯一的索引名稱。
- expireAfterSeconds:對于 TTL 索引而言,指定文檔應在多長時間后過期(以秒為單位)。
- partialFilterExpression:指定一個篩選器表達式,該表達式將被應用于索引的文檔子集。只有滿足表達式的文檔才會被包含在索引中。
- collation:指定索引應使用的排序規則。可以使用排序規則來控制大小寫、重音符號和特定字符的排序方式。
- storageEngine:指定索引應使用的存儲引擎。可以使用存儲引擎來控制索引的存儲方式和性能
例如,以下是在 users 集合中為 username 字段創建一個升序索引的示例:
db.users.createIndex({ username: 1 })
如果要在 users 集合中為 username 和 email 字段創建一個復合索引,可以使用以下代碼:
db.users.createIndex({ username: 1, email: 1 })
需要留意的是,創建索引可能需要一些時間,具體時間取決于集合的大小和索引的復雜度。在創建索引時,可以使用 explain() 方法來查看查詢計劃和性能統計信息,以便評估索引的效果和性能。