索引創建
1:索引提高查詢速度,降低寫入速度,權衡常用的查詢字段,不必在太多列上建索引
2.在mongodb中,索引可以按字段升序/降序來創建,便於排序
3.默認是用btree來組織索引文件,2.4版本以後,也允許建立hash索引.
查看查詢計劃
db.find(query).explain();
"cursor" : "BasicCursor", ----說明沒有索引發揮作用
"nscannedObjects" : 1000 ---理論上要掃描多少行
cursor" : "BtreeCursor sn_1", 用到的btree索引
常用命令:
查看當前索引狀態: db.collection.getIndexes();
創建普通的單列索引:db.collection.ensureIndex({field:1/-1}); 1是升續 -1是降續
刪除單個索引
db.collection.dropIndex({filed:1/-1});
一下刪除所有索引
db.collection.dropIndexes();
創建多列索引 db.collection.ensureIndex({field1:1/-1, field2:1/-1});
創建子文檔索引
db.collection.ensureIndex({filed.subfield:1/-1});
給自文檔加索引:
創建唯一索引:
db.collection.ensureIndex({filed.subfield:1/-1}, {unique:true});
創建稀疏索引:
稀疏索引的特點------如果針對field做索引,針對不含field列的文檔,將不建立索引.
與之相對,普通索引,會把該文檔的field列的值認爲NULL,並建索引.
適宜於: 小部分文檔含有某列時.
db.collection.ensureIndex({field:1/-1},{sparse:true});
如果不是稀疏索引,是普通索引,則沒有這一列也給你建立索引null:
建立了稀疏索引則查不到了:
db.tea.find();
{ "_id" : ObjectId("5275f99b87437c610023597b"), "email" : "[email protected]" }
{ "_id" : ObjectId("5275f99e87437c610023597c"), "email" : "[email protected]" }
{ "_id" : ObjectId("5275f9e887437c610023597e"), "email" : "[email protected]" }
{ "_id" : ObjectId("5275fa3887437c6100235980") }
如上內容,最後一行沒有email列,
如果分別加普通索引,和稀疏索引,
對於最後一行的email分別當成null 和 忽略最後一行來處理.
根據{email:null}來查詢,前者能查到,而稀疏索引查不到最後一行.
創建哈希索引(2.4新增的)
哈希索引速度比普通索引快,但是,無能對範圍查詢進行優化.(比如在機械硬盤上,100在這個位置,101可能就在更遠的位置,這樣並不好查)
適宜於---隨機性強的散列
db.collection.ensureIndex({file:’hashed’});
重建索引
一個表經過很多次修改後,導致表的文件產生空洞,索引文件也如此.
可以通過索引的重建,減少索引文件碎片,並提高索引的效率.
類似mysql中的optimize table
db.collection.reIndex()