MongoDB索引策略和索引类型
1. MongoDB索引策略和索引類型–簡介
MongoDB是一個開放源代碼,面向文檔的跨平臺數據庫,它使用C ++開發,并且是最流行和使用最廣泛的NoSQL類型數據庫之一。 它可在具有鍵-值對的類JSON文檔的頂部運行,其鍵值對在每個文檔中都無法定義。 同樣,它是免費使用的,因為它是在GNU Affero通用公共許可證和Apache許可證的組合下發布的。
在本課程中,我們將討論MongoDB中索引的類型以及可用于最大化數據庫性能以及對數據庫執行的操作的不同策略。 首先,我們還將研究數據庫中索引的重要性以及索引的存在如何對在我們的數據上運行的查詢有利有弊。 我們還將研究一些屬性,這些屬性可用于更改我們在數據庫中定義的MongoDB索引的行為,從而使其具有比簡單索引所指的擴展方式更廣泛的行為。 這種變化的行為不僅可以提高查詢級別的性能,還可以幫助我們從索引中實現更多功能。 讓我們開始吧。
2.什么是指數?
數據庫中的索引使查詢能夠比沒有索引的情況下執行查詢更有效,更快速地查找和過濾數據。 索引的最簡單示例是我們所有人都已經在書中使用的東西。 每本書的開頭都有一個“目錄”,可幫助讀者找到該書中出現的主題的頁碼。 要閱讀主題,我們只需要在目錄中找到它即可,主題目錄是主題的有序列表,我們可以從中獲取頁碼。 索引以相同的方式工作。 由于一個表(如果是MongoDB,則為一個集合)中可以有多個列,因此可以在集合中存在的任何列上形成索引。
當需要對多個參數執行搜索和過濾數據時,需要在集合中使用多個索引。 例如,對于包含有關書籍數據的表,我們可以根據作者姓名或價格或書籍名稱或表中存在的任何其他字段來過濾書籍數據。
我們還提到索引的存在會降低數據庫的性能 。 當集合中的索引過多時,這是可能的。 發生這種情況的原因是,無論何時在構建了太多索引的集合中有一個插入,都必須重新計算所有這些索引以調整新數據,這不是異步任務。 僅當所有索引都已更新時,才可以將寫入稱為成功。 這意味著,如果數據庫中任何集合上的索引過多,則當相應集合中發生插入時,MongoDB將必須重新訪問所有這些索引并重新計算。
3. MongoDB中的索引類型
MongoDB提供了許多不同的方式來形成索引并將其存儲在內存(和磁盤)中。 這些索引中的每一個都有不同的用途,并且可能僅適用于某些數據類型。 讓我們在這里看看這些索引類型。
3.1單字段索引
MongoDB支持所有數據類型的單個字段索引,并且可以在文檔的任何用戶定義字段上定義。
注意,對于單個字段索引,索引鍵的排序順序無關緊要,因為MongoDB可以從任一方向讀取索引。 如果要在字段book_name上創建單個字段索引,則可以使用以下查詢:
單場索引
db.books.createIndex( { book_name: 1 } )在上面的查詢中,數字1指定了索引的順序(實際上并不重要,因為MongoDB可以從任一方向讀取索引)。
3.2復合指數
通常,我們需要在多個字段的基礎上搜索表/集合,這非常常見。 如果是這種情況,我們可以考慮在MongoDB中創建復合索引。 復合索引支持基于多個字段的索引,這些字段擴展了索引的概念并將它們擴展到索引中的較大域。
制作復合索引時要注意的重要事項是字段順序很重要 。 因此,如果我們運行以下查詢:
復合指數
db.books.createIndex( { price: 1, book_name: 1 } )在此復合索引中,值首先按price字段排序,然后在每個價格值內,按book_name字段排序。 這也意味著字段的順序決定了此索引的鍵是否可以支持排序操作。 這也意味著我們運行以下查詢:
復合指數
db.books.createIndex( { book_name: 1, price: 1 } )在這種情況下, 即使字段相同 , 這也將創建另一個索引,并且不會重復使用上次查詢創建的索引。 這也意味著,如果在此集合中插入了一條新記錄,則將重新計算這兩個索引,這會使寫操作更重,因此也更慢。
3.3多鍵索引
我們研究的兩種類型的索引很簡單,并且為每個創建的索引使用不同的鍵。 這些索引也適用于所有數據類型。 多鍵索引是在數組字段上創建的索引,用于索引存儲在數組中的內容。
對數組的內容建立索引后,MongoDB會爆炸該數組,創建具有相同名稱的多個字段,每個字段在該數組中包含不同的值:
在MongoDB索引中爆炸數組
這允許非常高效的查詢,這些查詢嘗試將查詢中傳遞的值匹配到單個數組字段或數組字段的集合。 好消息是,如果指定的字段為數組,則MongoDB可以自行決定何時創建Multikey Index。
嘗試微調數據庫時可能遇到的限制之一是,多鍵索引可能無法完全覆蓋查詢中指定的過濾器。 用索引覆蓋查詢意味著我們可以完全從索引獲取結果數據,而根本不訪問數據庫中的數據。 由于索引最有可能存儲在RAM中,因此可以顯著提高性能。
3.4地理空間指數
MongoDB通過使我們能夠在文檔中存儲Geo-JSON集合,使我們能夠在數據庫中保存地理空間形狀。 為了有效查詢地理空間數據,MongoDB在內部提供了兩種類型的索引:
在此處閱讀有關這些索引如何工作的更多信息。 利用我們數據庫中的地理空間形狀,我們可以輕松地運行查詢以查找您當前位置附近的漢堡店,而地理空間索引有助于更快地執行此搜索。
3.5文字索引
MongoDB還提供了在文本字段上建立索引的功能,還支持在集合中搜索某些字符串內容。 要注意的是,這些索引不存儲諸如“ the”,“ a”,“ or”之類的停用詞。 在文本索引中,詞干僅存儲根詞。 我們可以使用以下查詢在字段上創建文本索引:
文字索引
db.books.createIndex( { book_name: "text" } )如果您使用英語以外的其他語言為文本字段建立索引,則可以使用以下查詢:
語言文字索引
db.books.createIndex( { book_name: "text" }, { default_language: "french" } )文本索引不區分大小寫和變音符號。 文本索引的版本3(版本3.4附帶的版本)支持通用C,簡單S和特殊的T大小寫折疊,如Unicode字符數據庫8.0大小寫折疊中所述。 除了不區分大小寫之外,文本索引的版本3還支持變音符號不敏感。
憑借高性能的text-index度量,MongoDB給Elasticsearch帶來了嚴峻的挑戰, Elasticsearch是一個主要用于Text-search查詢的數據庫。
3.5哈希指數
我們將研究的最后一種指數是哈希指數 。 這種索引類型使我們可以對內容執行基于哈希的分片 。 在這種類型的索引中,鍵的值是散列的。 由于這個原因, 這些索引只能支持相等匹配過濾器查詢,而不能用于基于范圍的查詢 。
如果要對索引運行范圍查詢,則可能必須在同一字段上創建多個索引,其中一個可以是常規索引,另一個可以是哈希索引。 最后, 哈希索引將浮點字段截斷為整數。 應盡可能避免對散列字段使用浮點數。
4. MongoDB中索引的屬性
可以在MongoDB中通過為索引指定特定的屬性來更改索引的行為。 其中一些屬性是:
4.1唯一索引
這些是可以通過規范使其唯一的索引。 這樣,當要求單個字段索引保持唯一時,它將拒絕該鍵的集合中已存在的值。 任何索引都可以在MongoDB中設為唯一。
在復合索引中,索引值的唯一性是通過與構成復合索引的鍵對應的值的組合來保持的。
4.2部分索引
如果您知道只需要為指定鍵或一組鍵建立索引的文檔,則可以通過指定過濾器查詢將索引轉換為部分索引。 僅通過此過濾器的文檔將在指定字段上建立索引。 這樣,部分索引的存儲需求要低得多,并且由于數據量較少,因此比普通索引要快得多。
要注意的是,僅當部分查詢可以滿足完整查詢時,查詢才會針對部分索引運行。
4.3稀疏指數
索引的稀疏屬性可確保索引僅包含實際包含已索引字段的文檔的條目。 稀疏索引將完全跳過沒有索引字段的文檔。
要注意的是,部分索引比稀疏索引更可取,因為稀疏索引的所有功能都可以通過添加更多索引的部分索引來實現。
4.4 TTL索引
如果要在指定時間段后從集合中刪除文檔,我們可以在字段上創建TTL索引。 這是索引的重要屬性,可用于定期更新的數據,從而使較舊的數據過時并且對于將來的目的(如日志數據)無用。
每隔60秒(或在指定的時間)運行一次后臺作業,將刪除MongoDB中的數據。 因此,不能明確保證文檔將在其過期日期后保留多長時間。
5.索引的局限性
盡管到目前為止,我們已經研究了索引的許多優點,但是索引也有一些缺點或限制。 讓我們在這里閱讀它們:
六,結論
在本課程中,我們研究了MongoDB中存在的各種類型的索引,以及如何通過可施加于它們的許多屬性和約束來改變和擴展它們的行為。 我們還描述了在使用索引時遇到的一些限制,在為集合創建索引以及將數據插入包含許多索引的MongoDB集合中時應注意這些限制,以確保我們不會使數據庫成為寫繁重的數據庫,導致整體性能下降。
如果在創建索引之前已經特別注意,并且為應用程序的MongoDB實例正確管理了內存,則索引的主要目的是通過一個主要因素來提高數據庫的性能。
閱讀關于如何通過一個Java應用程序,它集成了MongoDB的和執行各種查詢它與上手這個職位。 如果您更喜歡Javascript,請閱讀這篇文章。
翻譯自: https://www.javacodegeeks.com/2018/08/mongodb-index-strategies-and-types-of-indexes.html
總結
以上是生活随笔為你收集整理的MongoDB索引策略和索引类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为p40参数(华为p30参数)
- 下一篇: 初学者指南:如何为Red Hat Pro