MongoDB 索引篇


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})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM