mongodb 建索引導致資料庫阻塞

2021-08-29 04:42:55 字數 1069 閱讀 1461

在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 索引應該建在小字段上,對於大的文字字段甚至超長...