歡迎閱讀我們系列部落格文章中的第三篇,內容涵蓋 MongoDB 的效能最佳實務
在本系列中,我們涵蓋了在多個重要維度中大規模實現性能的關鍵考量因素,包括:
-
索引,我們今天將覆蓋
-
分片
-
交易/讀取/寫入的問題
-
硬件和操作系統配置
-
基准变暖
在過去的 15 年中,兩者都為幾個不同的資料庫供應商工作,我們可以放心地說,未能定義適當的索引是技術支援團隊必須與使用者解決的頭號效能問題。
因此,我們需要正確做到這一點... 以下是可以幫助您的最佳實踐。
索引在蒙古數據庫
在任何數據庫中,索引支持查詢的有效執行。 如果沒有這些文件,資料庫必須掃描集合或表格中的每個文件,以選取符合查詢陳述式的文件。 如果查詢存在適當的索引,資料庫可以使用索引來限制必須檢查的文件數目。
MongoDB 提供了廣泛的索引類型和功能,並具有特定語言的排序順序,以支持對數據的複雜訪問模式。 MongoDB 索引可以隨需創建和刪除,以適應不斷發展的應用程序需求和查詢模式,並且可以在文檔中的任何字段上聲明,包括嵌套在數組中的字段。
因此,讓我們介紹如何充分利用 MongoDB 中的索引。
使用複合索引
複合索引是由幾個不同欄位組成的索引。 例"如,如果您針對兩者進行查詢,建立同時包含"姓"氏"和名字的索引",通常最有效率的方式是建立同時包含"姓"氏"和名字的索引的名字。 我們的複合索引仍然可以用來篩選僅指定姓氏的查詢。
遵循 ESR 規則
對於複合索引,這個經驗法則對於決定索引中字段的順序很有幫助:
-
首先,添加那些運行平等查詢的字段
-
要索引的下一個字段應反映查詢的排序順序
-
最後一個字段表示數據的範圍被訪問
盡可能使用涵蓋的查詢
涵蓋的查詢會直接從索引傳回結果,而不必存取來源文件,因此非常有效率。
對於查詢被覆蓋過濾,排序和/或返回給客戶端所需的所有字段必須存在於索引中。 若要判斷查詢是否為涵蓋查詢,請使用 explain () 方法。 如果 explain () 輸出顯示的全部文件已連接為 0,這表明查詢被索引覆蓋。 在文檔中閱讀更多解釋結果。
試圖實現覆蓋查詢時的一個常見問題是默認情況下始終返回 _id 字段。 您需要將其從查詢結果中明確排除,或將其添加到索引中。
在分片集群中,MongoDB 內部需要訪問碎片密鑰的字段。 這意味著只有當碎片鍵是索引的一部分時,覆蓋查詢才可能。 無論如何,這樣做通常是一個好主意。
考慮低基數欄位上的索引時請小心
對具有少量唯一值(低基數)的字段進行查詢可以返回大型結果集。 複合索引可能包括具有低基數的字段,但組合字段的值應表現出高基數。
消除不必要的索
索引是資源密集型:即使在 MongoDB WiredTiger 存儲引擎壓縮,它們消耗 RAM 和磁盤。 更新欄位時,必須維護關聯的索引,導致額外的 CPU 和磁碟 I/O 負荷。
MongoDB 提供了工具來幫助您了解索引的使用情況,我們將在本文後面介紹。
萬用字元索引不能取代以工作負載為基礎的索引規劃
對於具有許多臨機操作查詢模式或處理高度多態文件結構的工作負載,萬用字元索引可為您提供許多額外的彈性。 您可以定義自動索引集合中所有相符欄位、子文件和陣列的篩選器。
與任何索引一樣,它們也需要存儲和維護,因此它們將為數據庫增加開銷。 如果事先知道應用程式的查詢模式,則應在查詢存取的特定欄位上使用更具選擇性的索引。
使用文本搜索匹配字段中的單詞
常規索引對於匹配字段的整個值非常有用。 如果您只想匹配具有大量文本的字段中的特定單詞,請使用文本索引。
如果您在 Atlas 服務中運行 MongoDB,請考慮使用阿特拉斯全文搜索,它提供了一個完全託管的 Lucene 索引與 MongoDB 數據庫集成。 FTS 提供更高的性能和更大的靈活性,可以對數據庫進行過濾,排名和排序,以快速向用戶顯示最相關的結果。
使用分段索引
只包含將透過索引存取的文件,以減少索引的大小和效能負荷。 例如,在 OrderID 欄位上建立部分索引,該索引僅包含訂單狀態為 [進行"中] 的訂單文件",或僅針對存在的文件編製電子郵件地址欄位的索引。
利用查詢陣列的多重索引鍵索引
如果您的查詢模式需要訪問單個數組元素,請使用多鍵索引。 MongoDB 會為陣列中的每個元素建立索引鍵,並且可以透過同時保留標量值和巢狀文件的陣列來建構。
避免使用未保留錨定或已植根的規則運算式
索引按值排序。 前導萬用字元效率低下,可能會導致完整索引掃描。 如果運算式中有足夠的區分大小寫的前導字元,尾隨萬用字元可以很有效率。
避免區分大小寫的正則表達式
如果使用正則表達式的唯一原因是不區分大小寫,請使用不區分大小寫的索引,因為這些索引速度更快。
使用可在 WiredTiger 儲存引擎中提供的索引最佳化
如果您要自我管理 MongoDB,則可以選擇性地將索引放置在自己的單獨磁碟區上,以便加快磁碟分頁和較低的競爭。 如需詳細資訊,請參閱線材虎選項。
使用說明計劃
我們在之前的查詢模式和分析文章中介紹了 MongoDB 的解釋計劃的使用,這是檢查單個查詢索引覆蓋率的最佳工具。
從解釋計劃工作,MongoDB 提供視覺化工具,以幫助進一步改善您的索引的理解,並提供智能和自動的建議,添加哪些索引。
使用 MongoDB 指南針和阿特拉斯資料瀏覽器將索引覆蓋
Compass 是 MongoDB 的免費 GUI,提供許多功能來協助您最佳化查詢效能,包括探索結構描述和視覺化查詢說明計畫,這兩個區域先前在本系列中涵蓋。
指南針中的索引選項卡為您的武器庫添加了另一個工具。 它列出了集合的現有索引,報告索引的名稱和鍵,以及它的類型,大小和任何特殊屬性。 通過索引選項卡,您還可以根據需要添加和刪除索引。
個真正有用的功能是索引使用,它顯示索引的使用頻率。 擁有太多索引可能會對效能造成損害,如同擁有太少,因此此功能在協助您識別和移除未使用的索引方面特別有用。 這可協助您釋放工作集空間,並消除維護索引所造成的資料庫額外負荷。
如果您在我們完全受管的 Atlas 服務中執行 MongoDB,資料總管中的索引檢視將提供與 Compass 相同的功能,而不必使用單獨的工具連線到資料庫。
您也可以使用 $IndexStats 彙總管線階段來擷取索引統計資料。
自動化索引建議
即使使用 MongoDB 工具提供的所有遙測,您仍然負責提取和分析所需的數據,以決定要添加哪些索引。
慢速查詢的臨界值會根據叢集上的平均作業時間而有所不同,以提供與工作負載相關的建議。
建議的索引會伴隨著範例查詢 (依查詢形狀分組) (例如,具有類似述詞結構、排序和投影的查詢),這些查詢會針對新增建議索引而受益的集合執行。 效能建議程式不會對 Atlas 叢集的效能產生負面影響。
如果您對建議感到滿意,就可以自動推出新的索引,而不會造成任何應用程式停機時間。
下一步是什麼
這包含了最新的性能最佳實踐系列。 MongoDB 大學提供有關 MongoDB 性能的免費基於 Web 的培訓課程。 這是了解更多有關索引功能的好方法。