關於mongodb建立索引的一些經驗總結

2021-12-29 20:45:56 字數 1976 閱讀 8890

想來接觸mongodb已經快一年了,對於它的索引知識也積攢了不少經驗,趁著這個月黑風高的夜晚,就把mongodb的索引總結一番吧。

一,索引介紹

mongodb具有兩類索引,分別為單鍵索引和復合索引。

1.單鍵索引是最簡單的一種索引,建立單鍵索引的開銷要比復合索引小很多。單鍵索引主要用於針對單值查詢的條件。

2.復合索引是將文件中的幾個鍵聯合起來建立的一種索引,建立這種索引需要更多的空間與效能開銷。分別體現在:

1).在給大量資料建立復合索引時,會阻塞資料庫的查詢,更不用說修改和插入操作了;

2).插入一條資料時,要花費更多的時間來給復合索引加資料;

3).建立的復合索引所站得空間大小根據資料的型別以及鍵的數量而有所不同。比如,如果你用五個numberint的鍵建立的復合索引的空間大小,並不會比兩個numberint和乙個string型別建立的復合索引占用更多的空間。索引在設計資料型別時,盡量將資料型別設定為numberint型別,以及盡量少使用string型別的資料做索引;

二,建立索引

建立索引的語句很簡單。

1.單鍵索引的建立:db.test.ensureindex(,)

2.復合索引的建立:db.test.ensureindex(,)

三,索引優化

索引的優化是乙個重頭戲,需要詳細的來解釋。我得測試資料插入了100萬條。字段分別為name,***,type,time,id

1.我們來看乙個簡單的查詢:db.test.find() 相信大家對這個查詢已經很熟悉了,然後我們來看看這個語句的索引執行計畫:

,"server" : "node1:27017"

}從這個執行計畫中可以看出,該條查詢語句查詢一條資料需要掃瞄整個表,這肯定扯淡了嘛,那這時候就該給這個字段建立索引了,建立乙個單鍵索引

db.test.ensureindex(,)

建立完索引之後,再來檢視看這條查詢語句的執行計畫:

,"server" : "node1:27017"

}簡直是逆天啊,nscanned和nscannedobjects居然從100萬下降到1條,也就是查詢資料時,只掃瞄了一條就已經找到,而且花費的時間是0秒,沒有建立索引時,居然是342毫秒,絕對索引威武啊。

2.這時候我想通過type和***來組合查詢某一條件的資料: db.test.find() 看看這句的執行計畫:

,"server" : "node1:27017"

}從這個計畫中可以看出,為了查詢幾萬條資料,它也掃瞄了整個表,很顯然,該建立索引了:

db.test.ensureindex(,)

建立完索引之後,再來執行查詢語句,看看執行計畫:

db.test.find().explain()

, "server" : "node1:27017"

}很顯然,絕對是乙個最佳索引,因為n=nscannedobjects=nscanned了,而且查詢時間從529毫秒下降到112毫秒了,這也是乙個質的飛躍,可以明顯的看到,它使用了剛剛建立的index_ts索引。

現在我又有乙個需求了,我想通過時間再來排序,好的,我們執行查詢語句: db.test.find().sort() 我們來看看這個查詢語句的執行計畫:

,"server" : "node1:27017"

}看到沒,這個查詢語句跟上乙個建立索引之後的查詢出來的結果相差還是很大的,scanandorder和millis,時間花費了將近700毫秒,而且在查詢完畢之後還要排序,這也太不近人情了,就加了乙個排序操作,怎麼會讓它從白天鵝變成醜小鴨了呢?啊,關鍵引數就是scanandorder,意思就是在記憶體中把結果排序了嘛,那好啊,既然你如此薄情,那我就建個復合索引來對抗: db.test.ensureindex(,),]

] },

"server" : "node1:27017"

}看到了嗎?各種引數又回到最佳狀態了。這時候可能有人會問了,為什麼要把time放到索引的最後而不是其它位置呢?其實這在建立索引時是有要求的,即:

mongodb建立索引

mongodb 提供了多樣性的索引支援,索引資訊被儲存在system.indexes 中,且預設總是為 id建立索引,它的索引使用基本和mysql 等關係型資料庫一樣。其實可以這樣說說,索引是凌駕於資料儲存系統之上的另一層系統,所以各種結構迥異的儲存都有相同或相似的索引實現及使用介面並不足為 奇。在...

MongoDB索引建立(5)

索引建立 1 索引提高查詢速度,降低寫入速度,權衡常用的查詢字段,不必在太多列上建索引 2.在mongodb中,索引可以按欄位公升序 降序來建立,便於排序 3.預設是用btree來組織索引檔案,2.4版本以後,也允許建立hash索引.檢視查詢計畫 db.find query explain curs...

MongoDB 關於索引的建議

我們收到了很多關於索引的問題。這一部分解答了其中的一小部分。有幾點要記住。第一,mongodb索引和mysql索引非常相似並且對於mysql的索引優化有很多也適用於mongodb。第二,更重要的是,這些索引的建議對你的應用提高也是有限的。對於應用的最佳索引策略應該基於很多的重要因素。包含了你期望查詢...