婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MongoDB索引使用詳解

MongoDB索引使用詳解

熱門標簽:智能電銷機器人銷售話術 徐州ai電銷機器人原理 企業智能外呼系統價格多少 福州電銷機器人源代碼 機器人外呼系統軟件存在問題 南京400電話怎樣辦理 高德地圖標注商戶位置 沈陽營銷電銷機器人招商 兗州電話外呼營銷系統

索引就像書的目錄,如果查找某內容在沒有目錄的幫助下,只能全篇查找翻閱,這導致效率非常的低下;如果在借助目錄情況下,就能很快的定位具體內容所在區域,效率會直線提高。

索引簡介

首先打開命令行,輸入mongo。默認mongodb會連接名為test的數據庫。

➜ ~ mongo
MongoDB shell version: 2.4.9
connecting to: test
> show collections
> 

可以使用show collections/tables查看數據庫為空。

然后在mongodb命令行終端執行如下代碼

> for(var i=0;i100000;i++) {
... db.users.insert({username:'user'+i})
... }
> show collections
system.indexes
users
> 

再查看數據庫發現多了system.indexes 和 users兩個表,前者即所謂的索引,后者為新建的數據庫表。
這樣user表中即有了10萬條數據。

> db.users.find()
{ "_id" : ObjectId("5694d5da8fad9e319c5b43e4"), "username" : "user0" }
{ "_id" : ObjectId("5694d5da8fad9e319c5b43e5"), "username" : "user1" }
{ "_id" : ObjectId("5694d5da8fad9e319c5b43e6"), "username" : "user2" }
{ "_id" : ObjectId("5694d5da8fad9e319c5b43e7"), "username" : "user3" }
{ "_id" : ObjectId("5694d5da8fad9e319c5b43e8"), "username" : "user4" }
{ "_id" : ObjectId("5694d5da8fad9e319c5b43e9"), "username" : "user5" }

現在需要查找其中任意一條數據,比如

> db.users.find({username: 'user1234'})
{ "_id" : ObjectId("5694d5db8fad9e319c5b48b6"), "username" : "user1234" }

發現這條數據成功找到,但需要了解詳細信息,需要加上explain方法

> db.users.find({username: 'user1234'}).explain()
{
  "cursor" : "BasicCursor",
  "isMultiKey" : false,
  "n" : 1,
  "nscannedObjects" : 100000,
  "nscanned" : 100000,
  "nscannedObjectsAllPlans" : 100000,
  "nscannedAllPlans" : 100000,
  "scanAndOrder" : false,
  "indexOnly" : false,
  "nYields" : 0,
  "nChunkSkips" : 0,
  "millis" : 30,
  "indexBounds" : {
    
  },
  "server" : "root:27017"
}

參數很多,目前我們只關注其中的"nscanned" : 100000和"millis" : 30這兩項。

nscanned表示mongodb在完成這個查詢過程中掃描的文檔總數。可以發現,集合中的每個文檔都被掃描了,并且總時間為30毫秒。

如果數據有1000萬個,如果每次查詢文檔都遍歷一遍。呃,時間也是相當可觀。

對于此類查詢,索引是一個非常好的解決方案。

> db.users.ensureIndex({"username": 1})

然后再查找user1234

> db.users.ensureIndex({"username": 1})
> db.users.find({username: 'user1234'}).explain()
{
  "cursor" : "BtreeCursor username_1",
  "isMultiKey" : false,
  "n" : 1,
  "nscannedObjects" : 1,
  "nscanned" : 1,
  "nscannedObjectsAllPlans" : 1,
  "nscannedAllPlans" : 1,
  "scanAndOrder" : false,
  "indexOnly" : false,
  "nYields" : 0,
  "nChunkSkips" : 0,
  "millis" : 0,
  "indexBounds" : {
    "username" : [
      [
        "user1234",
        "user1234"
      ]
    ]
  },
  "server" : "root:27017"
}

的確有點不可思議,查詢在瞬間完成,因為通過索引只查找了一條數據,而不是100000條。

當然使用索引是也是有代價的:對于添加的每一條索引,每次寫操作(插入、更新、刪除)都將耗費更多的時間。這是因為,當數據發生變化時,不僅要更新文檔,還要更新級集合上的所有索引。因此,mongodb限制每個集合最多有64個索引。通常,在一個特定的集合上,不應該擁有兩個以上的索引。

小技巧

如果一個非常通用的查詢,或者這個查詢造成了性能瓶頸,那么在某字段(比如username)建立索引是非常好的選擇。但只是給管理員用的查詢(不太在意查詢耗費時間),就不該對這個字段建立索引。

復合索引

索引的值是按一定順序排列的,所以使用索引鍵對文檔進行排序非常快。

db.users.find().sort({'age': 1, 'username': 1})

這里先根據age排序再根據username排序,所以username在這里發揮的作用并不大。為了優化這個排序,可能需要在age和username上建立索引。

db.users.ensureIndex({'age':1, 'username': 1})
這就建立了一個復合索引(建立在多個字段上的索引),如果查詢條件包括多個鍵,這個索引就非常有用。

建立復合索引后,每個索引條目都包括一個age字段和一個username字段,并且指向文檔在磁盤上的存儲位置。
此時,age字段是嚴格升序排列的,如果age相等時再按照username升序排列。

查詢方式

點查詢(point query)

用于查詢單個值(盡管包含這個值的文檔可能有多個)

db.users.find({'age': 21}).sort({'username': -1})

因為我們已經建立好復合索引,一個age一個username,建立索引時使用的是升序排序(即數字1),當使用點查詢查找{age:21},假設仍然是10萬條數據,可能年齡是21的很多人,因此會找到不只一條數據。然后sort({'username': -1})會對這些數據進行逆序排序,本意是這樣。但我們不要忘記建立索引時'username':1是升序(從小到大),如果想得到逆序只要對數據從最后一個索引開始,依次遍歷即可得到想要的結果。

排序方向并不重要,mongodb可以從任意方向對索引進行遍歷。
綜上,復合索引在點查詢這種情況非常高效,直接定位年齡,不需要對結果進行排序,返回結果。

多值查詢(multi-value-query)

db.users.find({'age': {"$gte": 21, "$lte": 30}})

查找多個值相匹配的文檔。多值查詢也可以理解為多個點查詢。
如上,要查找年齡介于21到30之間。monogdb會使用索引的中的第一個鍵"age"得到匹配的結果,而結果通常是按照索引順序排列的。

db.users.find({'age': {"$gte": 21, "$lte": 30}}).sort({'username': 1})

與上一個類似,這次需要對結果排序。
在沒有sort時,我們查詢的結果首先是根據age等于21,age等于22..這樣從小到大排序,當age等于21有多個時,在進行usernameA-Z(0-9)這樣排序。所以,sort({'username': 1}),要將所有結果通過名字升序排列,這次不得不先在內存中進行排序,然后返回。效率不如上一個高。

當然,在文檔非常少的情況,排序也花費不了多少時間。
如果結果集很大,比如超過32MB,MongoDB會拒絕對如此多的數據進行排序工作。

還有另外一種解決方案

也可以建立另外一個索引{'username': 1, 'age': 1}, 如果先對username建立索引,當再sortusername,相當沒有進行排序。但是需要在整個文檔查找age等于21的帥哥美女,所以搜尋時間就長了。

但哪個效率更高呢?

如果建立多個索引,如何選擇使用哪個呢?
效率高低是分情況的,如果在沒有限制的情況下,不用進行排序但需要搜索整個集合時間會遠超過前者。但是在返回部分數據(比如limit(1000)),新的贏家就產生了。

>db.users.find({'age': {"$gte": 21, "$lte": 30}}).
sort({username': 1}).
limit(1000).
hint({'age': 1, 'username': 1})
explain()['millis']
2031ms

>db.users.find({'age': {"$gte": 21, "$lte": 30}}).
sort({username': 1}).
limit(1000).
hint({'username': 1, 'age': 1}).
explain()['millis']
181ms

其中可以使用hint指定要使用的索引。
所以這種方式還是很有優勢的。比如一般場景下,我們不會把所有的數據都取出來,只是去查詢最近的,所以這種效率也會更高。

索引類型

唯一索引

可以確保集合的每個文檔的指定鍵都有唯一值。

db.users.ensureIndex({'username': 1, unique: true})
比如使用mongoose框架,在定義schema時,即可指定unique: true.
如果插入2個相同都叫張三的數據,第二次插入的則會失敗。_id即為唯一索引,并且不能刪除。

稀疏索引

使用sparse可以創建稀疏索引

>db.users.ensureIndex({'email': 1}, {'unique': true, 'sparse': true})

索引管理

system.indexes集合中包含了每個索引的詳細信息

db.system.indexes.find()

1.ensureIndex()創建索引

db.users.ensureIndex({'username': 1})
后臺創建索引,這樣數據庫再創建索引的同時,仍然能夠處理讀寫請求,可以指定background選項。

db.test.ensureIndex({"username":1},{"background":true})

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"
  }
]

其中v字段只在內部使用,用于標識索引版本。

3.dropIndex刪除索引

> db.users.dropIndex("username_1")
{ "nIndexesWas" : 2, "ok" : 1 }

全選復制放進筆記> db.users.dropIndex({"username":1})

您可能感興趣的文章:
  • MongoDB中唯一索引(Unique)的那些事
  • MongoDB的基礎查詢和索引操作方法總結
  • MongoDB中創建索引需要注意的事項
  • MongoDB性能篇之創建索引,組合索引,唯一索引,刪除索引和explain執行計劃
  • 深入理解MongoDB的復合索引
  • mongodb處理中文索引與查找字符串詳解
  • MongoDB查詢字段沒有創建索引導致的連接超時異常解案例分享
  • 關于MongoDB索引管理-索引的創建、查看、刪除操作詳解
  • MongoDB自動刪除過期數據的方法(TTL索引)
  • 關于對MongoDB索引的一些簡單理解

標簽:本溪 景德鎮 鶴崗 大理 吉安 邯鄲 昭通 丹東

巨人網絡通訊聲明:本文標題《MongoDB索引使用詳解》,本文關鍵詞  MongoDB,索引,使用,詳解,MongoDB,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MongoDB索引使用詳解》相關的同類信息!
  • 本頁收集關于MongoDB索引使用詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人动漫精品一区二区| 91麻豆精品国产91久久久使用方法| 欧美一级搡bbbb搡bbbb| 国产伦精品一区二区三区免费迷| 国产精品久久国产精麻豆99网站| 欧美三级一区二区| 国产成人av一区二区| 亚洲妇女屁股眼交7| 久久精品亚洲麻豆av一区二区| 成人av手机在线观看| 国产酒店精品激情| 琪琪久久久久日韩精品| 亚洲日本护士毛茸茸| 久久一日本道色综合| 538prom精品视频线放| 7777精品伊人久久久大香线蕉| 欧美一卡二卡三卡| 国产午夜精品一区二区| 国产精品麻豆欧美日韩ww| 精品蜜桃在线看| 日韩一区二区高清| 欧美日韩国产一二三| 日本高清不卡视频| bt欧美亚洲午夜电影天堂| 国产乱码精品1区2区3区| 成人动漫一区二区| 欧美一级午夜免费电影| 国产性做久久久久久| 亚洲综合一二三区| 亚洲女同ⅹxx女同tv| 中文字幕一区二区三区不卡在线 | 精品在线播放免费| 亚洲大型综合色站| 亚洲中国最大av网站| 极品少妇xxxx偷拍精品少妇| 成人午夜精品一区二区三区| 成人久久久精品乱码一区二区三区| 色综合天天狠狠| 欧美日韩中文精品| 久久精品一区二区| 日韩精品福利网| 久久精品国产久精国产| 久热成人在线视频| 欧美影片第一页| 69堂国产成人免费视频| 国产精品久久久久久久裸模| 久久99热这里只有精品| 欧美精品久久一区二区三区| 日韩一级视频免费观看在线| 亚洲日本成人在线观看| 福利电影一区二区三区| 色综合久久综合网欧美综合网| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲夂夂婷婷色拍ww47| 床上的激情91.| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲欧洲三级电影| 国产一区中文字幕| 精品少妇一区二区三区在线播放| 婷婷激情综合网| 狠狠久久亚洲欧美| 97久久精品人人澡人人爽| 欧美精品久久一区| 亚洲国产日产av| 欧美三级乱人伦电影| 亚洲精品ww久久久久久p站| 美女mm1313爽爽久久久蜜臀| 春色校园综合激情亚洲| 国产拍欧美日韩视频二区| 又紧又大又爽精品一区二区| 91尤物视频在线观看| 欧美电视剧免费全集观看| 国产精品久久影院| 成人午夜免费电影| 亚洲天堂精品视频| 91国模大尺度私拍在线视频| 玉米视频成人免费看| 色网综合在线观看| 亚洲成人av电影| 欧美精品第1页| 视频一区二区三区入口| 日韩欧美一卡二卡| 国产一区二区美女诱惑| 国产日产亚洲精品系列| www.日韩大片| 一区二区三区精品在线| 国产高清不卡一区| 国产精品网站在线播放| 色偷偷一区二区三区| 五月天视频一区| 久久婷婷国产综合国色天香| 成人免费视频caoporn| 亚洲日本电影在线| 亚洲色大成网站www久久九九| av午夜一区麻豆| 亚洲福中文字幕伊人影院| 欧美变态口味重另类| eeuss鲁片一区二区三区| 天天综合网 天天综合色| 久久综合久色欧美综合狠狠| 色综合天天综合| 国产精品国产成人国产三级 | 亚洲成av人片| 日韩精品一区二区三区四区| 粗大黑人巨茎大战欧美成人| 亚洲国产成人91porn| 久久久久久久久久美女| 欧美午夜精品一区二区蜜桃| 久久99精品久久久久久国产越南| 国产精品麻豆一区二区| 日韩丝袜情趣美女图片| av午夜一区麻豆| 精品在线观看免费| 亚洲v中文字幕| ...中文天堂在线一区| 欧美mv日韩mv亚洲| 欧美在线视频你懂得| 亚洲综合色噜噜狠狠| 国产日韩欧美精品一区| 欧美一级片免费看| 色综合天天综合网国产成人综合天 | 色婷婷精品久久二区二区蜜臂av| 美女视频黄 久久| 亚洲精品亚洲人成人网在线播放| 26uuu久久综合| 91精品国产综合久久久蜜臀图片| 99精品视频在线观看免费| 国产乱理伦片在线观看夜一区| 无码av免费一区二区三区试看| 国产精品欧美精品| 久久久不卡影院| 精品乱人伦小说| 日韩精品一区二区三区四区视频| 欧美日韩五月天| 色婷婷久久久久swag精品| 99这里都是精品| 成人激情视频网站| 成人国产精品免费观看视频| 国产精品亚洲人在线观看| 国产在线播放一区| 国产一区在线观看视频| 美女脱光内衣内裤视频久久影院| 香港成人在线视频| 日韩精品乱码免费| 日韩电影免费在线| 国产精品传媒入口麻豆| 国产欧美日韩卡一| 日本一区二区成人| 欧美日本韩国一区二区三区视频| 在线观看欧美日本| 在线观看一区不卡| 欧美性生活影院| 欧美精品日韩精品| 精品免费国产一区二区三区四区| 欧美成人一区二区| 久久久久久99久久久精品网站| 精品国产免费人成在线观看| 色94色欧美sute亚洲13| 欧美午夜精品电影| 日韩网站在线看片你懂的| 精品国产免费一区二区三区香蕉| 国产亚洲人成网站| 亚洲欧美另类久久久精品2019| 亚洲综合区在线| 日本一区中文字幕| 国产成人综合亚洲91猫咪| 一本一道波多野结衣一区二区| 91精品福利视频| 日韩欧美激情一区| 中文字幕亚洲电影| 亚洲一卡二卡三卡四卡五卡| 肉肉av福利一精品导航| 国产成人午夜片在线观看高清观看| youjizz国产精品| 欧美丰满嫩嫩电影| 欧美国产激情二区三区| 一区二区欧美视频| 国产在线精品免费| 色噜噜久久综合| 久久精品亚洲麻豆av一区二区| 亚洲另类在线制服丝袜| 久久99国产精品免费| 色婷婷综合久久久中文一区二区| 日韩欧美一区二区不卡| 亚洲另类色综合网站| 激情综合网最新| 欧美色图激情小说| 亚洲国产经典视频| 婷婷久久综合九色国产成人| 懂色av一区二区在线播放| 91精品一区二区三区久久久久久| 国产精品五月天| 精品一区二区三区免费观看| 色婷婷国产精品久久包臀| 欧美zozo另类异族| 午夜在线成人av| 91麻豆高清视频| 欧美激情中文字幕| 国产在线播放一区| 538在线一区二区精品国产|