1. 程式人生 > >mongodb索引

mongodb索引

ja

索引的原理

當往某各個集合插入多個文檔後,每個文檔在經過底層的存儲引擎持久化後,會有一個位置信息,通過這個位置信息,就能從存儲引擎裏讀出該文檔

MMAPv1:文件id+文件內offset

WiredTiger: WiredTiger在存儲文檔時生成的一個key,通過這個key能訪問到對應 的文檔。

CPU飆升了?半天還是沒出結果?要想提升速度,你是否想起了索引!!


建立索引後,MongoDB會額外存儲一份按age字段升序排序的索引數據,索引結構類似如下,索引通常采用類似btree的結構持久化存儲,以保證從索引裏快速找出某個age值對應的位置信息,然後根據位置信息就能讀取出對應的文檔。

技術分享圖片

索引就是將文檔按照某個(或某些)字段順序組織起來,以便能根據該字段高效的查詢。索引的基本作用:搜索+排序


有了索引,至少能優化如下場景的效率:

查詢,比如查詢年齡為18的所有人。

更新/刪除,將年齡為18的所有人的信息更新或刪除,因為更新或刪除時,需要根據條件先查詢出所有符合條件的文檔,所以本質上還是在優化查詢。

排序,將所有人的信息按年齡排序,如果沒有索引,需要全表掃描文檔,然後再對掃描的結果進行排序。

當存在索引時,執行DML操作將會更慢(維護索引)。

MongoDB默認會為插入的文檔生成_id字段(如果應用本身沒有指定該字段),_id是文檔唯一的標識,為了保證能根據文檔id快遞查詢文檔,MongoDB默認會為集合創建_id字段的索引。


索引的特性

索引存儲在內存(RAM)中,應該確保該索引的大小不超過內存的限制。

如果索引的大小大於內存的限制,MongoDB會刪除一些索引,這將導致性能下降。


索引掃描類型:

索引覆蓋:如果所有需要的字段都在索引中,不需要額外的字段,就可以滿足索引覆蓋的要求,不再需要從數據頁加載數據,這就是索引覆蓋。

索引掃描

集合掃描


索引的限制

1、每個collection限制64個索引。

2、索引名的長度不能超過125個字符。

3、一個復合索引最多可以有31個字段。

4、所有索引字段是一個數組,不能使用索引覆蓋查詢。

5、正則表達式及非操作符,如$nin,$not等;算術運算符,如$mod,等;$where子句。

6、索引越多寫性能越差,例如:一張頻繁修改的collection ,其索引達到20-30索引性能嚴重瓶頸。

7、建立索引是一個IO密集型操作,特別是當你的集合很大的時候。包括MySQL在內的所有支持輔助索引的數據庫系統都有這種情況。如果你需要在一個大集合上建立索引,可以考慮在後臺建立它。

8、如果很少對集合進行讀取,可以不使用索引

索引的類型

1、單字段索引

2、復合索引

3、多鍵索引

4、Hash索引

5、地理位圖索引

6、TTL索引

7、全文索引



mongodb索引