如果現在的數據集很大,構建索引會花費很長時間。可是,爲了優化索引,我們必會通過explain命令,找出需要添加索引的字段。可是在生產環境中,要在大數據集建立所以,這簡直是夢魘,如何解決呢。我們記了一次實驗。
db.user.find({text:"sumongodb"}).explain();
provides information such as the following:
{ "cursor" : "BasicCursor",
"indexBounds" : [ ],
"nscanned" : 57594,
"nscannedObjects" : 57594,
"n" : 3 ,
"millis" : 108 }
Cursor:BasicCursor表示沒有用到索引(類似SQL數據庫的全部掃描。)BtreeCursor表示使用了索引。 indexBounds:使用到的索引; nscanned:掃描的總記錄數; nscannedObjects:掃描的總對象數;
這查詢沒有用到索引。
解決方法:
由於我們的架構是複製集模式,所以建議先把從節點,移除集羣。具體操作
1.先查看複製集狀態:rs.status()找出secondary對應的name字段的值。例如
name:192.168.0.1:27017
2.在主機上移除從節點 :rs.remove('192.168.0.1;27017')
3.在該節點上建立索引text字段的索引。db.user.ensureIndex({"text":1})
4.之後,把該節點重新加回到replset中。切換主從操作