2 回答

TA貢獻1812條經驗 獲得超5個贊
MongoDB以某種方式連接復合密鑰,并將其用作BTree中的密鑰。
在找到單個項目時-樹中節點的順序無關。
如果要返回一系列節點-相互靠近的元素將沿著同一棵樹的枝條向下移動。節點在此范圍內越近,其檢索速度就越快。
單字段索引-命令不重要如果它們在提升順序上接近在一起,它們也將以降序緊密地在一起。
當你有一個復合鑰匙-命令開始起作用了。
例如,如果鍵為A升序B,索引可能如下所示:
Row A B1 1 12 2 63 2 7 4 3 45 3 56 3 67 5 1
對A、升序B降序的查詢將需要跳過索引,以返回行,并且速度更慢。例如,它將返回行1, 3, 2, 6, 5, 4, 7
與索引相同的Range查詢將按正確的順序順序返回行。
在BTree中查找記錄需要O(log(N))時間。按順序查找記錄范圍僅為OLog(N)+k,其中k是要返回的記錄數。

TA貢獻1860條經驗 獲得超9個贊
mongodb在前臺直接運行建立索引命令的話,將造成整個數據庫阻塞,因此索引建議使用 background 的方式建立。但是這也會帶來一定的問題,在
2.6 版本之前,在 secondary server 中即使使用 background 方式建立索引,secondary 還是會以
foreground 方式建立索引,它導致 secondary 同樣引發數據庫阻塞問題。2.6 版本修復了這個 Bug,2.6 版之后使用
background 方式建立索引時,真正轉向后臺運行了。
為了盡量降低建立索引對 MongoDB Server 的影響,有一種方法是把 MongoDB Server 轉換成 standalone 模式后建立。具體做法如下:
1.首先把 secondary server 停止,在取消 --replSet 參數,并且更改 MongoDB port 之后重新啟動 MongoDB,這時候 MongoDB 將進入 standalone 模式;
2.在 standalone 模式下運行命令 ensureIndex 建立索引,建議使用 foreground 方式運行;
3.建立索引完畢之后關閉 secondary server 按正常方式啟動;
4.根據上述 1~3 的步驟輪流為 secondary 建立索引,最后把 primary server 臨時轉換為 secondary server,同樣按 1~3 的方法建立索引,再把其轉換為 primary server。
這種方式還是比較麻煩的,但可以把建立索引操作對 MongoDB 的影響降到最低,在有些情況下還是值得做的。
- 2 回答
- 0 關注
- 600 瀏覽
添加回答
舉報