十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
先在數(shù)據(jù)庫上增加一些數(shù)據(jù),輸入下面的命令:
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名注冊、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、??稻W(wǎng)站維護(hù)、網(wǎng)站推廣。
for(var i=1;i<10;i++) db.customers.insert({name:"jordan"+i,country:"American"})
for(var i=1;i<10;i++) db.customers.insert({name:"gaga"+i,country:"American"})
for(var i=1;i<10;i++) db.customers.insert({name:"ham"+i,country:"UK"})
for(var i=1;i<10;i++) db.customers.insert({name:"brown"+i,country:"UK"})
for(var i=1;i<10;i++) db.customers.insert({name:"ramda"+i,country:"Malaysia"})
使用下面的命令查看當(dāng)前數(shù)據(jù)庫并不存在索引(_id除外)
db.system.indexes.find()
現(xiàn)在在name字段增加一列索引,索引語法:
db.collection.ensureIndex(keys,options)
keys是一個document,包含要增加索引的字段和索引的排序方向;option是可選參數(shù),控制索引的創(chuàng)建排序方式。具體命令如下:
db.customers.ensureIndex({name:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
利用indexes.find()可以查詢到剛剛建立好的索引。如果建立唯一索引可以使用如下命令:
db.customers.ensureIndex({name:1},{unique:true})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
(此文使用唯一索引)
查看數(shù)據(jù)是否使用索引:
db.customers.find({name:"ramda9"}).explain()
{
"cursor" : "BtreeCursor name_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"name" : [
[
"ramda9",
"ramda9"
]
]
},
"server" : "localhost.localdomain:27017",
"filterSet" : false
}
從粗體字的"nscannedObjects"看出查詢過程中掃描的總文檔數(shù)是使用了索引?,F(xiàn)在再次查詢country字段:
db.customers.find().count()
45
db.customers.find({country:"Malaysia"}).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 9,
"nscannedObjects" : 45,
"nscanned" : 45,
"nscannedObjectsAllPlans" : 45,
"nscannedAllPlans" : 45,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"server" : "localhost.localdomain:27017",
"filterSet" : false
}
可以看出這是使用了全表掃描,并沒有使用到索引。
建立復(fù)合索引:
現(xiàn)在為country建立一個索引:
for(var i=1;i<10;i++) db.customers.insert({name:"lanbo"+i,country:"Malaysia"})
查詢索引情況:
db.customers.find({country:"Malaysia"}).explain()
結(jié)果是全表掃描?,F(xiàn)在嘗試在country上建立一個普通索引:
db.customers.ensureIndex({country:1})
重新再次執(zhí)行explain語句:
db.customers.find({country:"Malaysia"}).explain()
{
"cursor" : "BtreeCursor country_1",
"isMultiKey" : false,
"n" : 18,
"nscannedObjects" : 18,
"nscanned" : 18,
"nscannedObjectsAllPlans" : 18,
"nscannedAllPlans" : 18,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"country" : [
[
"Malaysia",
"Malaysia"
]
]
},
"server" : "localhost.localdomain:27017",
"filterSet" : false
}
使用了索引并且查詢到18條記錄。現(xiàn)在創(chuàng)建一個復(fù)合索引:
db.customers.ensureIndex({name:1,coutry:1})
db.customers.find({name:"lanbo2",country:"Malaysia"}).explain()
{
"cursor" : "BtreeCursor name_1_coutry_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 3,
"nscannedAllPlans" : 3,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"name" : [
[
"lanbo2",
"lanbo2"
]
],
"coutry" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
},
"server" : "localhost.localdomain:27017",
"filterSet" : false
}
此處使用了name與country的復(fù)合索引。(要刪除了name的唯一索引才可以,db.customers.dropIndex("name_1"))