您好,登錄后才能下訂單哦!
索引的原理
當往某各個集合插入多個文檔后,每個文檔在經過底層的存儲引擎持久化后,會有一個位置信息,通過這個位置信息,就能從存儲引擎里讀出該文檔
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、全文索引
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。