在mongodb上建索引可能會對mongodb集群對可用性產生負面影響。在生產服務上,如果針對乙個大集合觸發建立索引,且在前台執行,你可能會發現,在索引建完之前,整個集群都無影響。在乙個大集合上,這個過程可能會持續幾個小時,甚至幾天。
解決的方法很簡單,mongodb 提供了兩種建索引的訪問,一種是 background 方式,不需要長時間占用寫鎖,另一種是非 background 方式,需要長時間占用鎖。使用 background 方式就可以解決問題。 例如,為超大表 posts 建立索引, 千萬不用使用
複製** **如下:
db.posts.ensureindex()
而應該使用
複製** **如下:
db.posts.ensureindex(, )
如果已經再建索引了,如何停止?
一旦你觸發乙個索引,簡單的重啟服務並不能解決這個問題,因為mongodb會繼續重啟前的建索引的工作。如果之前你執行後台建索引任務,在服務重啟後它會變成前台執行的任務。在這種情況下,重啟會讓問題變得更糟糕。
如果你已經啟動了建索引的任務,該如何停止它呢?幸運的是,有方法相對簡單的停止建索引任務。
使用db.currentop()定位建索引程序,然後使用db.killop()殺掉操作。建索引大致會是以下的樣子:
, "client" : "***x", "desc" : "conn", "msg" : "index: (2/3) btree bottom up 292168587/398486401 64%" }
如果正在建索引的節點不能響應新連線,或者killop不起作用,使用選項二。
選項二:配置「noindexbuildretry」並重啟
1. 重啟mongo 片的服務加上引數
--noindexbuildretry don't retry any index builds that were
interrupted by shutdown
通過mongod --help 檢視此引數意義
2. 找到沒有建完的索引,刪除
3. 去掉noindexbuildretry 後重啟
資料庫建索引的規律
索引是以表列為基礎的資料庫物件。索引中儲存著表中排序的索引列,並且紀錄了索引列在資料庫表中的物理儲存位置,實現了表中資料的邏輯排序。通過索引,可以加快資料的查詢速度和減少系統的響應時間 可以使表和表之間的連線速度加快。但是,不是在任何時候使用索引都能夠達到這種效果。若在不恰當的場合下,使用索引反而會...
MongoDB資料庫索引操作講解
索引就是用來加速查詢的。資料庫索引與書籍的索引類似 有了索引就不需要翻遍整本書,資料庫則可以直接在索引中查詢,使得查詢速度能提高幾個數量級。在索引中找到條目以後,就可以直接跳轉到目標文件的位置。一 建立索引 ensureindex 語法結構 db.collection.ensureindex key...
資料庫表建索引的經驗
一 哪些情況應該建索引1 表的主鍵 外來鍵必須有索引 2 資料量超過300的表應該有索引 3 經常與其他表進行連線的表,在連線欄位上應該建立索引 4 經常出現在where子句中的字段,特別是大表的字段,應該建立索引 5 索引應該建在選擇性高的字段上 6 索引應該建在小字段上,對於大的文字字段甚至超長...