索引支持是MongoDB高效查詢的關鍵。如果沒有索引,MongoDB必須執行集合掃描(掃描集合中所有的文檔),然后篩選匹配文檔。MongoDB中的索引與其他數據庫系統中的索引類似。MongoDB在集合級別定義索引,并支持MongoDB集合中文檔的任何字段或子字段定義索引。MongoDB索引通過B-tree實現,查詢復雜度介于O(1)到logn之間。MongoDB提供了許多不同的索引類型來支持特定類型的數據和查詢。
- 單字段索引:除MongoDB定義的_id索引外,MongoDB還支持在文檔的單個字段上創建用戶定義的升序/降序索引。
- 復合索引:MongoDB支持用戶在多個字段上定義索引,即復合索引。復合索引中字段的順序很重要。如果復合索引為{A:1,B:-1},則索引首先以A字段進行排序,然后在每個A值以B字段進行排序。
- 多健索引:MongoDB使用多鍵索引來索引存儲在數組中的內容。如果索引字段包含數組值,MongoDB會為數組的每個元素創建單獨的索引條目。這些多鍵索引允許查詢通過匹配數組中的元素來獲取包含數組的文檔。
以下是MongoDB查詢優化的一些基本原則:
- 在查詢條件、排序條件、統計條件的字段上選擇創建索引,可以顯著提高查詢效率。
- 必要時使用hint()強制使用某個索引查詢。
- 只查詢要使用的字段,而不查詢所有字段。
- 減少使用低效的操作符,如$where和$exists操作符,完全不能使用索引;$ne和$not操作符使用索引效率較低,甚至有時完全不用索引;$nin操作符總是會全表掃描.
- MongoDB在一次查詢中只能使用一個索引,所以使用$or查詢多次在合并結果,不如單次查詢的效率高。
- 考慮到數據分片,盡量減少跨分片查詢,比如盡量少用$in,$in會讓你的查詢去每一個分片上查一次,可以考慮在在每個分片上建索引。
最后,祝每個人的query查詢都快到起飛!