導讀
為資料建立索引有助於提高查詢資料的效能,本篇文章總結了建立MongoDB索引應遵循的規則。
我將這些規則分成四類:
1.“query”
2.“sort”
3.“RAM”
4.“selectivity” query
db.collection.find({})
這一部分主要針對查詢中的query部分,也就是find操作,說明我們如何建立索引,以及什麼樣的查詢能夠使該索引有效。
【總的規則】:索引中包含find中的全部欄位。
【具體規則】:
1.如果所有查詢都使用了同樣的,唯一的欄位,則建立只包含一個欄位的索引。
【舉例】:db.collection.find({x:”}),那麼索引就是{x:1}
2.建立複合索引來支援包含多個欄位的查詢。複合索引支援查詢中有全部索引欄位或其子集(從開頭算起的子集,類似於首碼一樣的東西)的查詢。
【舉例】:如果索引是{x:1,y:1,Z:1},那麼它支援find的查詢條件為{x:”},{x:”,y:”}以及{x:”,y:”,z:”}
【注意】:這裡的子集,有些不同於數學中的子集。這裡的子集有個專業名稱Index Prefix,索引首碼,所以暗含了是從前往後,是有順序的。可以把索引看成一個單詞,然後Index Prefix就是從前往後截取索引中的部分。
sort
db.collection.find().sort({})
這一部分主要針對查詢中的sort部分,說明針對要排序的欄位,我們應該如何建立索引,或者說如何排序才能使建立的索引有效。
【規則】:
1.如果索引是唯一欄位,查詢中的sort也使用該欄位,那麼無論是升序還是降序,索引都有效。
【舉例】:如果索引是{x:1},sort({x:1})或({x:-1})都可以。
2.如果索引是複合欄位,那麼sort中欄位的排序方向(升序或降序)和要和索引完全一致,或每個欄位都和索引相反。
【舉例】:如果索引是{x:1,y:-1},那麼sort({x:1,y:-1})或者sort({x:-1,y:1})
3.如果索引是複合欄位,且查詢中的sort部分的欄位如果是是索引中的全部欄位或子集(同上面的意思一致),那麼find()中的欄位滿足上一部分我們說的query的第2條規則:‘複合索引支援查詢中有全部索引欄位或其子集(從開頭算起的子集,類似於首碼一樣的東西)的查詢。’
4.如果索引是符合欄位,但是查詢中的sort部分的欄位不是索引的全部欄位或子集,這個時候find中的欄位,必須是sort中欄位在索引中其位置之前的欄位。
【舉例】:索引是{x:1,y:1,z:1},如果sort({y:1}),那麼find必須是索引中y之前的欄位,包括y,即({x:1,y:1}) RAM
index的大小需要小於RAM的大小,才能避免從磁碟中查詢。
計算index的大小:
db.collection.totalIndexSize()
實際當中,應計算所有collection上index的大小,並使RAM大於index大小總和。
selectivity
在建立索引時,要保證儘可能高的可選擇性,不要建立了索引之後,仍需要掃描整個collection。
比如collection中有個欄位是Status,該欄位的值就‘A’(Active)或‘D’(Delete),這個時候如果索引是該欄位的話,就會是很低的選擇性,這個時候,可以結合另一個欄位來建立索引,或者讓Status的值分布更廣泛些。 導圖總結