MongoDB索引

1.語法準備

  • ​ explain() :檢視執行計劃
  • ​ getIndexes() :檢視所有索引
  • ​ hint() : 強制使用某一索引進行查詢

2.資料準備:

{
"_id" : ObjectId("6127594238754d0067383ff6"),
"xh" : 1,
"szly" : {
"lymc" : "AA大廈",
"z" : "A",
"lh" : "1",
"sy" : "啥意思"
},
"qtxx" : {
"nsssjg" : "A、區內",
"sfwkgh" : "否",
"cylx" : "第三產業",
"rzlysj" : "2011.11",
"fwcqdw" : "河南置業有限公司",
"fwszlc" : "5",
"fjh" : "601、604",
"mj" : 56,
"cyry" : 5,
"yzj" : 2,
"qylx" : "H、其他",
"ssqylx" : "C、非上市企業",
"lxr" : "AA蘭",
"lxdh" : "85685685"
},
"sssq" : "裕鴻樓宇社群",
"frxx" : {
"qyfr" : "AA蘭",
"qyfzr" : "AA蘭",
"lxfs" : "18888888888"
},
"qyjbxx" : {
"xy" : "P 教育",
"qymc" : "鄭州市管城回族培訓學校",
"gsyyzzh" : "31313123",
"swdjzh" : "123123123",
"tyxydm" : "313123123",
"zcdz" : "裕鴻國際A座6層",
"jjxz" : "有限責任公司",
"zczb" : 100
},
"importMonth" : "202108",
"batch" : "1629968706400_1",
"createBy" : "1",
"department" : "區政府",
"createTime" : ISODate("2021-08-26T09:05:06.416Z"),
"status" : 0,
"ddly" : {
"zh" : "",
"lh" : "",
"sy" : ""
},
"lcxx" : {
"zb" : "",
"szlc" : "",
"mj" : ""
},
"updateBy" : "1",
"updateTime" : "2021-08-27 11:14:31"
}

3.索引

3.1 唯一索引

 預設索引:_id(唯一性的索引)

 唯一索引會保證索引對應的鍵不會出現相同的值,如果唯一索引所在的欄位有重複資料寫入時,丟擲異常。

db.getCollection("qydrmb_copy").createIndex({"qtjbxx":1},{unique:true})

3.2 單鍵索引

 最普通索引,不會自動建立。

 建立單建索引示例

db.getCollection("qydrmb_copy").createIndex({"qtjbxx":1})

db.getCollection("qydrmb_copy").createIndex({"qtxx.fwcqdw":1})

注意

  • ​ qydrmb_copy:集合名稱

  • ​ qtjbxx:集合欄位名

  • ​ qtxx.fwcqdw:集合中子集合欄位名

  • ​ 1:升序排序

  • ​ -1:降序排序

3.3 多鍵索引

 多鍵索引和單鍵索引建立形式一樣,區別:欄位的值,值具有多個記錄,如,陣列

注意:通過 getIndexes() 不能區分該索引是單鍵索引還是多鍵索引,可以 explain() 執行計劃的列印資訊中檢視(isMultKey 屬性)

3.4 複合索引

 複合索引針對多個欄位聯合建立索引,先按照第一個欄位排序,第一個欄位相同的文件按照第二個欄位排序,依次類推。

 語法:

db.collection_name.createIndex({索引鍵名:排序規則, 索引鍵名:排序規則, ...})

 複合索引能滿足的查詢場景比單欄位索引更豐富,不光能滿足多個欄位組合起來的查詢,也能滿足所有能匹配符合索引字首的查詢。

注意:建立一個複合索引 A、B, 查詢條件中包含A,B會走索引,查詢條件中包含A,也會走索引,查詢條件中沒有A,只有一個B,此時不會走索引。A就稱為索引字首。

3.5 交叉索引

 交叉索引就是為了一個集合的多個欄位分別建立索引,在查詢的時候通過多個欄位作為查詢條件,這種情況稱為交叉索引。

 交叉索引和複合索引區別:交叉索引 A、B是兩個索引,複合索引中 A、B組成了一個索引。

注意:一個集合中包含交叉索引A、 B,在查詢條件中包含A、或者包含B、或者包含A、B的情況下,都會觸發交叉索引。

3.6 部分索引

 部分索引是針對符合某個特定條件的文件建立索引,3.2版本才支援該特性。

 MongoDB 部分索引只為那些在一個集合中,滿足指定的篩選條件的文件建立索引。簡單理解就是部分索引是帶有過濾條件的索引,即索引只存在於某些文件之上

​ 語法:

db.collection_name.createIndex({索引鍵名:排序規則},{partialFilterExpression:{"前面進行排序的鍵名":{匹配條件:條件值}}})

注意:部分索引和唯一所以一塊使用,唯一約束只適用於滿足篩選條件的文件。

3.7覆蓋索引

 1.所有的查詢欄位是索引的一部分

 2.查詢返回的所有欄位在同一個索引中

例如:如果一個索引中包含A、B 兩個欄位,查詢條件只有一個A, 返回結果為 A、B兩個欄位,則此時會觸發覆蓋索引,即不再掃描整個文件,而是直接從索引中獲取資料。

3.8 全文索引

 全文檢索對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。

 MongoDB 從 2.4 版本開始支援全文檢索,目前支援15種語言的全文索引(danish、dutch、english、finnish、french、german、hungarian、italian、norwegian、portuguese、romanian、russian、spanish、swedish、turkish)。

 mongo2.6之後預設開啟全文檢索。

建立語法:

db.collection_name.ensureIndex({全文索引的欄位名:"text"})

查詢語法:

db.collection_name.find({$text:{$search:"檢索的值"}})

4.索引限制

4.1 查詢限制

  • 索引不能被以下查詢使用:

  • 正則表示式(最左匹配除外)及非操作符,如$nin,$not等

  • 算數運算子,如 $mod 等。

  • 可以使用explain()來檢視是否執行了索引

4.2 範圍限制

  • 集合中索引不能超過64個

  • 索引名的長度不能超過128個字元

  • 一個符合索引最多可以有31個欄位

  • 索引的大小不能超過記憶體的限制,如果超出限制,Mongo會刪除一些索引,會導致效能下降。