MongoDB 索引篇
索引的簡介
索引可以加快查詢的速度,但是過多的索引或者規范不好的索引也會影響到查詢的速度。且添加索引之后的對文檔的刪除,修改會比以前速度慢。因為在進行修改的時候會對索引進行更新。
創建一個簡單的索引
db.wsc.ensureIndex({"username":1})
這樣在查找的時候速度回變快
db.wsc.find({usernmae:"jack ma"})
mongodb限制每個集合最多有64個索引。通常,在一個特定的集合上,不應該擁有兩個以上的索引。
.
**復合索引** 建立了一個復合索引(建立在多個字段上的索引),如果查詢條件包括多個鍵,這個索引就非常有用
db.users.ensureIndex({'age':1, 'username': 1})
查詢方式
點查詢 point query
用於查詢單個值(盡管包含這個值的文檔可能有多個)
db.users.find({'age': 21})
可能21歲的人很多,所以這個查詢會有很多的結果的返回。
多值查詢 multi-value-query
查找多個值相匹配的文檔。多值查詢也可以理解為多個點查詢。
db.users.find({'age': {"$gte": 21, "$lte": 30}})
###**索引的類型** ***單鍵索引*** 就是最普通的的索引
db.users.ensureIndex({'username': 1})
**唯一索引** 確定集合的每一個文檔的指定鍵都是唯一的值
db.users.ensureIndex({'username': 1, unique: true})
這樣創建了一個值,以后再插入數據的時候,username鍵的值不能重復,否則會插入不成功
多鍵索引
如果某個鍵在文檔中被標記為數組,那么這個索引就會被標記為多鍵索引
> db.members.find()
{ "_id" : ObjectId("1"), "tags" : [ "ame", "fear", "big" ] }
{ "_id" : ObjectId("2"), "tags" : [ "ame", "fear", "big", "chi" ] }
{ "_id" : ObjectId("3"), "tags" : [ "ame", "jr", "big", "chi" ] }
當我查找tags='jr'數據時,db會查找所有文檔,所以nscanned=3,並且返回一條,此時n=1。
>db.members.find({tags: 'jr'}).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 1,
"nscanned" : 3,
}
然后建立索引
db.members.ensureIndex({tags:1})
之后我們在對tags='jr'進行查找,此時nscanned=1,並且isMultiKey由原來的false變為true。所以可以說明,mongodb對數組做了多個鍵的索引,即把所有的數組元素都做了索引。
> db.members.find({tags: 'jr'}).explain()
{
"cursor" : "BtreeCursor tags_1",
"isMultiKey" : true,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
}
**過期索引** 顧名思義就是索引過期之后,相應的數據會被刪除。比較適合一些存儲一段時間的數據。 *和設置單鍵索引很類似,只是多個expireAfterSeconds參數,單位是秒。*
db.collectionName.ensureIndex({key: 1}, {expireAfterSeconds: 10})
例子 下面建立一個索引,然后數據會在30秒后刪除
db.members.ensureIndex({time:1}, {expireAfterSeconds: 30})
被索引鍵的值必須是ISODate時間類型,例如new Date()類型。如果是非時間類型,則不會自動刪除
稀疏索引
使用sparse可以創建稀疏索引和唯一索引
db.users.ensureIndex({'email': 1}, {'unique': true, 'sparse': true})
創建了稀疏索引的字段,在插入數據的時候無論是否這個字段是否存在都可以插入成功。
哈希索引
db.collection.createIndex( { _id: "hashed" } )
地理位置索引
當文檔中有這樣的數據時
db.places.insert(
{
loc : { type: "Point", coordinates: [ -73.97, 40.77 ] },
name: "Central Park",
category : "Parks"
}
)
db.places.insert(
{
loc : { type: "Point", coordinates: [ -73.88, 40.78 ] },
name: "La Guardia Airport",
category : "Airport"
}
)
可以創建地理索引
db.places.createIndex( { loc : "2dsphere" } )
**文本索引 **
###索引管理 system.indexes集合中包含了每個索引的詳細信息
db.system.indexes.find()
**1 創建索引** 在**mongo shell**中國有兩個方法
ensureIndex()
createIndex()
例子
db.users.ensureIndex({'username': 1})
2 getIndexes()查看索引
db.collectionName.getIndexes()
——————————————————
db.users.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "test.users",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"username" : 1
},
"ns" : "test.users",
"name" : "username_1"
}
]
3.dropIndex刪除索引
> db.users.dropIndex("username_1"){ "nIndexesWas" : 2, "ok" : 1 }
或
db.users.dropIndex({"username":1})