Mongodb常用索引介紹
索引的作用:
當一個集合數據量很大時,從這個集合中查找某條記錄時,會從這個集合的第一條順序查找起直到找到特定記錄或者查找完整個集合,這個查找時間會很長,查詢花費的時間幾十秒到幾分鐘。而索引是特殊的數據結構,索引存儲在一個易于遍歷讀取的數據集合中,當查找特定記錄時就從這個特殊的易于遍歷的數據結構中查找,查詢花費的時間大大的縮短。
創建索引:
MongoDB使用 createIndex () 方法來創建索引,具體命令:db.collection. createIndex ({key:1}),其中collection為要在集合上創建索引的集合名,?Key 值為你要創建的索引字段,1為指定按升序創建索引,-1為指定按降序創建索引。
索引分類:
單字段索引:
只在一個字段上建立索引,db.collection. createIndex ({key:1}),這樣就在集合collection上的字段key創建了升序的單字段索引。建立了單字段索引后,就能加速對key字段的查詢速度。Mongodb對每個集合默認建立的_id字段就是一個單字段索引,也是唯一的主鍵。
復合索引:
db.collection. createIndex ({key:1,key1:1})建立在兩個字段key,key1上的復合索引,所謂復合索引就是針對多個字段聯合創建的索引,先按第一個字段排序,第一個字段相同的文檔按第二個字段排序,依次類推。復合索引不僅能滿足多個字段組合起來的查詢,也能滿足所以能匹配符合索引前綴的查詢。例如db.collection. createIndex ({key:1,key1:1})不僅能在字段key,key1上加速查詢,也能滿足只查找key字段的加速查詢。但如果只查找key1字段,則無法進行索引加速。如果經常在key1字段上查詢,則應該建立db.collection. createIndex ({key1:1,key:1})的符合索引。除了查詢的需求能夠影響索引的順序,字段的值分布也是一個重要的因素。如果 key字段的取值很有限,即擁有相同key字段的文檔會有很多;而key1字段的取值則豐富很多,擁有相同key1字段的文檔很少,則先按key1字段查找,再在相同key1的文檔里查找key字段更為高效。
hash索引:
db.collection.createIndex({key: "hashed"})這樣就在字段key上創建了hash索引,mongodb自動計算字段的hash值,無需用戶計算,hash索引只能進行字段的完全匹配查詢,不能進行范圍查詢。
索引的一些特殊屬性:
唯一索引:
對于某些字段值,用戶希望是唯一的不重復的,這時就可以設置索引的屬性為唯一的。db.collection.createIndex({ key: 1 },{ unique: true })在創建key字段為索引的時候加上屬性字段unique建立的就是唯一單字段索引。db.collection.createIndex({ key: 1, key1: 1 },{ unique: true })創建的就是唯一復合索引。
TTL索引:
如果希望當某些記錄超過一段時間后,自動從數據庫里面被刪除,那就可以在建立索引的時候帶上TTL屬性,但需要滿足一個條件:建立TTL索引的那個字段必須是data類型的字段或者包含data類型的數組。db. collection.createIndex({ "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 }),其中lastModifiedDate字段的類型必須是data或包含data的數組,這樣當lastModifiedDate字段的值距離當前時間值超過3600秒后就會被刪除。
索引優化:
當一個建立索引的查詢依然花費較長時間時,怎么看這個索引存在的問題呢?可以通過查詢計劃來決定如何優化。在查找語句后面加上.explain()例如: db.collection.find({key: 18}).explain(),通過查詢的執行計劃可以看出索引上是否存在問題:查詢的字段沒有建立索引,建立了索引但執行查詢時沒有使用預期的索引。
數據結構 MongoDB
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。