1. 程式人生 > >mongo索引小結

mongo索引小結

官方文件索引部分的地址:

以下大部分內容來自官方文件。

1.建立索引

1)建立單個索引

db.collection.ensureIndex({a:1})

在a欄位上建立一個升序的索引(對於單個欄位的索引,升序或是降序都一樣)。

2)建立複合索引

db.collection.ensureIndex({a:1,b:-1})

3)建立稀疏索引

db.collection.ensureIndex({a:1},{sparse:true})

索引中將不包含沒有a欄位的文件。

4)建立唯一索引

db.collection.ensureIndex({a:1},{unique:true})

為a欄位建立唯一索引。

當mongo要索引一個欄位時,如果一篇文件中沒有這個欄位,這篇文件就會被索引為null,

因為唯一索引不能有重複值,所以必須和稀疏索引配合使用,如:

db.collection.ensureIndex({a:1},{unique:true,sparse:true})

複合索引也可以加唯一限制,如:

db.collection.ensureIndex({a:1,b:1},{unique:true})

5)在後臺建立索引

db.collection.ensureIndex({a:1},{background:true})

6)丟棄重複資料

要強制在一個有重複資料的欄位上建立唯一索引,可以使用dropDups選項,這會強制mongo

在建立唯一索引時刪除重複資料(危險操作),如:

db.collection.ensureIndex({a:1},{dropDups:true})

2.檢視索引

1)檢視某個庫上的所有索引

db.system.index.find()

2)檢視某個表上的所有索引

db.collection.getIndexes()

3.刪除索引

1)刪除表上的某個索引

db.collection.dropIndex({a:1})

2)刪除表上的所有索引

db.collection.dropIndexes()

4.重建索引

db.collection.reIndex()

以上操作會刪除表上的所有索引(包含_id)並重建所有索引。

5.在副本集上建立索引

後臺建立索引操作在一個副本集的從節點(secondary)上會變成前臺操作,這時建立索引的操作會

阻塞從節點上的所有的複製和讀操作。

從節點會在主節點完成建立索引的操作後開始建立索引,在分片叢集環境(sharded cluster)中,

mongos會向每個分片上的副本集環境的主節點發送ensureIndex(),然後在主節點完成建立索引後

複製到從節點上。

為了在副本集環境中將建立索引的影響降低到最小,使用以下方法在從節點上建立索引:

1)在一個從節點上停止mongod程序,使用另一個埠號不採用--replSet選項重啟mongod程序,這

   個mongod例項現在已"獨立"(standalone)模式執行;

2)在這個mongod例項上建立新索引或者重建索引;

3)採用--replSet選項重啟mongod例項。允許複製操作catch up這個成員;

4)在其它的從節點上重複這個操作;

5)在這個集(set)上的主節點上執行rs.stepDown(),然後在之前的主節點上重複這個過程。

6.索引中的升序鍵和降序鍵

對於單個鍵的索引,鍵的順序沒有關係。但是對於符合索引,鍵的升、降順序有很大影響。

比如說一個表包含使用者名稱(username)和該使用者發表文章的時間(time),如果你需要經常查詢某使用者最

新發表的文章,你應該建立這樣的索引:

db.collection.ensureIndex({"username":1,"time":-1})

7.索引的限制

1)一個表上的索引不能超過64個;

2)索引的鍵不能超過1024bytes();

3)索引的名字(包含名稱空間)必須少於128個字元;

8.索引策略

MongoDB對於每個操作只能使用一個索引,$or的每一個子句可以使用自己的索引。

對於下邊的索引:

db.collection.ensureIndex({"category":1,"item":1})

無論單獨查詢category、item,還是兩者一起查詢,該索引都有效。但是有個例外,使用$or操作符時,

一個查詢不能使用複合索引,只能使用單個索引。

一個多欄位的複合索引可以支援所有在這些欄位上就字首子集進行查詢的需求,例如:

db.collection.ensureIndex({x:1,y:1,z:1})

以上索引可以支援如下查詢需求:

db.collection.find({x:232})

db.collection.find({x:232,y:3})

db.collection.find({x:232,y:3,z:34})

索引{x:1,y:1,z:1}可以支援一些索引{x:1,z:1}支援的查詢?

對於查詢db.collection.find({x:5}).sort({z:1}),索引{x:1,z:1}既支援查詢頁支援排序,而索引

{x:1,y:1,z:1}只支援查詢?

使用索引為查詢的結果排序:

比如有這樣一個索引

db.collection.ensureIndex({a:1,b:1,c:1,d:1})

以下的查詢和排序操作可以使用索引:

db.collection.find().sort({a:1})

db.collection.find().sort({a:1,b:1})

db.collection.find({a:4}).sort({a:1,b:1})

db.collection.find({b:5}).sort({a:1,b:1})

db.collection.find({a:5}).sort({b:1,c:1})

db.collection.find({a:5,c:4,b:3}).sort({d:1})

db.collection.find({a:{$gt:4}}).sort({a:1,b:1})

db.collection.find({a:{$gt:5}}).sort({a:1,b:1})

db.collection.find({a:5, b:3,d:{$gt:4}}).sort({c:1})

db.collection.find({a:5, b:3,c:{$lt:2},d:{$gt:4}}).sort({c:1})

以下的查詢和排序不能使用索引:

db.collection.find().sort( { b:1 } )

db.collection.find( { b:5 } ).sort( { b:1 } )

對於不使用索引的sort()操作,當使用超過32Mb記憶體時,sort()操作將退出。

在一個"寫任務"很重的系統中,新增每一個索引時要特別謹慎。