最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解MongoDB范圍片鍵和哈希片鍵

 更新時間:2021年03月23日 14:26:39   作者:AsiaYe  
這篇文章主要介紹了MongoDB范圍片鍵和哈希片鍵的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MongoDB,感興趣的朋友可以了解下

01 片鍵

    MongoDB的片鍵決定了集合中存儲的數(shù)據(jù)在集合中的分布情況,具體的方法是使用片鍵值的范圍來對集合中的數(shù)據(jù)進(jìn)行分區(qū)。舉個例子:

假如我們以年齡age來作為片鍵,那么age的范圍理論上是0~80,此時,MongoDB會為我們定義age的四個范圍區(qū)間,他們分別是:0~20,20~40,40~60,60~80,每個范圍都是一個chunk,這樣我們寫入數(shù)據(jù)之后,數(shù)據(jù)里面的數(shù)據(jù)塊就有:

chunk1:  age  0~20

chunk2:  age  20~40   

chunk3:age  40~60

chunk4:age  60~80

需要注意的是,在一個集合中,被選為片鍵的這個字段上必須有一個支持片鍵的索引,或者是必須有一個以這個字段開頭的聯(lián)合索引。

通常情況下,我們給字段添加的索引,最常見的是普通索引或者哈希索引,

普通的索引字段如果作為片鍵,那么這個片鍵我們稱為范圍片鍵;

哈希索引字段如果作為片鍵,那么這個片鍵我們稱為哈希片鍵。

下面我們來看二者的不同之處:

02 范圍片鍵(遞增片鍵)

范圍片鍵,顧名思義,就是將數(shù)據(jù)根據(jù)片鍵劃分到連續(xù)的范圍里面,在這個模型中,那些值"相似"的文檔可能位于同一個片中。例如下面這樣:

這中分片方式是MongoDB默認(rèn)的分片方式,它有好處也有壞處。

好處:

    可以高效的讀取連續(xù)范圍內(nèi)的目標(biāo)文檔。如果你使用范圍查詢,則可以比較快速的拿到所有的結(jié)果值。因為數(shù)據(jù)所在的數(shù)據(jù)chunk比較少。

壞處:

    如果我們寫入的數(shù)據(jù)都幾種在某一個分片區(qū)間,那么讀寫性能都可能因為片鍵劃分不均勻而降低。(例如下圖中,數(shù)據(jù)的基數(shù)大部分在20~maxKey,則大部分都在chunk C的位置,本身分布不均勻),Chunk C的寫入壓力將會增大。

在下列場景中,使用范圍片鍵比較合適:

1、數(shù)據(jù)的基數(shù)比較大

2、分片的寫入頻率比較低(插入較少不容易產(chǎn)生chunk的搬運(yùn))

3、非單調(diào)變化的分片(如果單調(diào)寫,則會分到同一個塊里面,容易達(dá)到chunk割裂的條件,產(chǎn)生chunk的搬運(yùn))

如果數(shù)據(jù)滿足上面的三個條件,則我們寫入的數(shù)據(jù)可能是這樣的:

就是比較均勻的寫入到了數(shù)據(jù)塊中。

03 哈希片鍵

    哈希片鍵使用哈希索引在共享集群中對數(shù)據(jù)進(jìn)行分區(qū)。哈希索引計算單個字段的哈希值作為索引值,該值用作片鍵(注意,這里并不是字段本身的值,而是hash之后的值)。

    使用哈希索引,我們寫入數(shù)據(jù)之后,對應(yīng)寫入數(shù)據(jù)塊的圖示可能如下:

從圖中我們看出來,雖然我們輸入的x值比較接近,分別是25、26、27,但是,經(jīng)過hash函數(shù)之后,他們所在的數(shù)據(jù)塊序號可能差距很遠(yuǎn)。

哈希分片在分片集群中提供了更均勻的數(shù)據(jù)分布,集合中那些具有近似值的文檔,可能會被分到不同的塊上,mongos更有可能執(zhí)行廣播操作來完成給定的范圍查詢。

哈希值得計算,是由MongoDB來負(fù)責(zé)的,不是應(yīng)用程序負(fù)責(zé)的

作為哈希片鍵的索引字段應(yīng)該有如下特點:

1、具有大量不同的值

2、哈希索引適合單調(diào)變化的字段,例如自增值,時間值等(因為可以將單調(diào)的字段通過hash函數(shù)映射到不同的塊上去,從而分散寫入壓力,例如下圖,雖然數(shù)據(jù)連續(xù),但是寫入了不同的數(shù)據(jù)塊中)

它的缺點也比較明顯,當(dāng)我們查詢某個范圍的值的時候,hash索引會查找更多的數(shù)據(jù)分片,并將最終的結(jié)果匯總起來交給我們。

在實際生產(chǎn)環(huán)境中,我們需要結(jié)合自己的需求來確定使用哪種類型的片鍵,再次強(qiáng)調(diào),在設(shè)定某個字段作為片鍵之前,需要先在當(dāng)前字段創(chuàng)建對應(yīng)類型的索引,或者創(chuàng)建一個以當(dāng)前字段開頭的聯(lián)合索引。否則設(shè)定片鍵的語句會報錯。

下面是分片創(chuàng)建從無到有的過程舉例:

1、創(chuàng)建表,只有一個字段name,并插入數(shù)據(jù)
mongos> use aaa
switched to db aaa
mongos> db.aaa.insert({name:1})
WriteResult({ "nInserted" : 1 })
mongos> db.aaa.insert({name:2})
WriteResult({ "nInserted" : 1 })
mongos> db.aaa.insert({name:3})
WriteResult({ "nInserted" : 1 })
mongos> db.aaa.insert({name:4})
WriteResult({ "nInserted" : 1 })
mongos> 

2、查看數(shù)據(jù)
mongos> db.aaa.find()
{ "_id" : ObjectId("5fdb7d54d91f2f9bae3b09a1"), "name" : 1 }
{ "_id" : ObjectId("5fdb7d56d91f2f9bae3b09a2"), "name" : 2 }
{ "_id" : ObjectId("5fdb7d59d91f2f9bae3b09a3"), "name" : 3 }
{ "_id" : ObjectId("5fdb7d5cd91f2f9bae3b09a4"), "name" : 4 }

3、允許數(shù)據(jù)庫分片
mongos> sh.enableSharding("aaa")
{
 "ok" : 1,
 "operationTime" : Timestamp(1608220038, 3),
 "$clusterTime" : {
  "clusterTime" : Timestamp(1608220038, 3),
  "signature" : {
   "hash" : BinData(0,"shemm3xvSYrMiy9t7gSYcVtFUuE="),
   "keyId" : NumberLong("6894922308364795934")
  }
 }
}
mongos> 

4、在name字段創(chuàng)建hash索引
mongos> db.aaa.createIndex({name:"hashed"},{background:true})
{
 "raw" : {
  "sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020" : {
   "createdCollectionAutomatically" : false,
   "numIndexesBefore" : 1,
   "numIndexesAfter" : 2,
   "ok" : 1
  }
 },
 "ok" : 1,
 "operationTime" : Timestamp(1608220115, 3),
 "$clusterTime" : {
  "clusterTime" : Timestamp(1608220115, 3),
  "signature" : {
   "hash" : BinData(0,"S3Wz9G26eJyOcwa1OLS6TVYu6SE="),
   "keyId" : NumberLong("6894922308364795934")
  }
 }
}

5、以name字段作為片鍵創(chuàng)建哈希分片
mongos> sh.shardCollection("aaa.aaa",{name:"hashed"})
{
 "collectionsharded" : "aaa.aaa",
 "collectionUUID" : UUID("20a3895e-d821-43ae-9d28-305e6ae03bbc"),
 "ok" : 1,
 "operationTime" : Timestamp(1608220238, 10),
 "$clusterTime" : {
  "clusterTime" : Timestamp(1608220238, 10),
  "signature" : {
   "hash" : BinData(0,"qeQlD3jsSvRZkyamEa2hjbezEdM="),
   "keyId" : NumberLong("6894922308364795934")
  }
 }
}

6、查看分片信息
mongos> db.printShardingStatus()
--- Sharding Status --- 
 sharding version: {
 "_id" : 1,
 "minCompatibleVersion" : 5,
 "currentVersion" : 6,
 "clusterId" : ObjectId("5fafaf4f5785d9965548f687")
 }
 shards:
 { "_id" : "sharding_yeyz", "host" : "sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020", "state" : 1 }
 { "_id" : "sharding_yeyz1", "host" : "sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026", "state" : 1 }
 active mongoses:
 "4.0.6" : 1
 autosplit:
 Currently enabled: yes
 balancer:
 Currently enabled: yes
 Currently running: no
 Failed balancer rounds in last 5 attempts: 2
 Last reported error: Could not find host matching read preference { mode: "primary" } for set sharding_yeyz
 Time of Reported error: Wed Nov 18 2020 17:08:14 GMT+0800 (CST)
 Migration Results for the last 24 hours: 
  No recent migrations
 databases:
 { "_id" : "aaa", "primary" : "sharding_yeyz", "partitioned" : true, "version" : { "uuid" : UUID("26e55931-d1c1-4dc5-8a03-b5b0e70f6f43"), "lastMod" : 1 } }
  aaa.aaa
   shard key: { "name" : "hashed" }
   unique: false
   balancing: true
   chunks:
    sharding_yeyz 1
   { "name" : { "$minKey" : 1 } } -->> { "name" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 0)

以上就是詳解MongoDB范圍片鍵和哈希片鍵的詳細(xì)內(nèi)容,更多關(guān)于MongoDB范圍片鍵和哈希片鍵的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于mongoDB的聚合操作_aggregate()歸納詳解

    關(guān)于mongoDB的聚合操作_aggregate()歸納詳解

    這篇文章主要介紹了關(guān)于mongoDB的聚合操作_aggregate()歸納詳解,關(guān)系是關(guān)聯(lián)關(guān)系的一種,是強(qiáng)的關(guān)聯(lián)關(guān)系,聚合是整體和個體之間的關(guān)系,聚合關(guān)系也是通過實例變量實現(xiàn)的。在聚合關(guān)系中,兩個類是處在不平等層次上的,一個代表整體,另一個代表部分,需要的朋友可以參考下
    2023-07-07
  • MongoDB部署超詳細(xì)步驟記錄

    MongoDB部署超詳細(xì)步驟記錄

    這篇文章主要介紹了MongoDB部署超詳細(xì)步驟的相關(guān)資料,包括了MongoDB的安裝配置、MongoDB?Shell的安裝、常用命令操作及備份與恢復(fù)方法,需要的朋友可以參考下
    2025-03-03
  • 基于?MongoTemplate實現(xiàn)MongoDB的復(fù)雜查詢功能

    基于?MongoTemplate實現(xiàn)MongoDB的復(fù)雜查詢功能

    本文介紹了如何使用MongoTemplate進(jìn)行復(fù)雜的MongoDB查詢,展示了如何進(jìn)行分頁和排序查詢,通過示例代碼,展示了如何處理不同類型的查詢,如單條件查詢、模糊查詢、組合條件查詢以及分頁排序查詢,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • mongoDB 4.0事務(wù)回滾的辛酸歷程探究

    mongoDB 4.0事務(wù)回滾的辛酸歷程探究

    這篇文章主要給大家介紹了關(guān)于mongoDB 4.0事務(wù)回滾的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MongoDB具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • MongoDB釋放空閑空間的幾種常用方法

    MongoDB釋放空閑空間的幾種常用方法

    這篇文章主要給大家介紹了關(guān)于MongoDB釋放空閑空間的幾種常用方法,分別包括compact、db.repairDatabase()、secondary節(jié)點重同步以及db.copyDatabase()這幾種方法,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-07-07
  • c#操作mongodb插入數(shù)據(jù)效率

    c#操作mongodb插入數(shù)據(jù)效率

    今天小編就為大家分享一篇關(guān)于c#操作mongodb插入數(shù)據(jù)效率,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • MongoDB數(shù)據(jù)庫條件查詢技巧總結(jié)

    MongoDB數(shù)據(jù)庫條件查詢技巧總結(jié)

    查詢是數(shù)據(jù)庫的基本操作之一,下面這篇文章主要給大家介紹了關(guān)于MongoDB數(shù)據(jù)庫條件查詢技巧的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • mongoDB4.2.8備份恢復(fù)與導(dǎo)出導(dǎo)入(推薦)

    mongoDB4.2.8備份恢復(fù)與導(dǎo)出導(dǎo)入(推薦)

    這篇文章主要介紹了mongoDB4.2.8備份恢復(fù)與導(dǎo)出導(dǎo)入的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • MongoDB中查詢(find操作符)詳細(xì)指南

    MongoDB中查詢(find操作符)詳細(xì)指南

    MongoDB是領(lǐng)先的NoSQL數(shù)據(jù)庫之一,以其快速的性能,靈活的模式,可伸縮性和強(qiáng)大的索引功能而聞名,下面這篇文章主要給大家介紹了關(guān)于MongoDB中查詢(find操作符)的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • mongodb三分鐘入門大全

    mongodb三分鐘入門大全

    MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的,接下來通過本文給大家介紹mongodb三分鐘入門大全,感興趣的朋友一起看看吧
    2022-01-01

最新評論

乌恰县| 揭东县| 玉山县| 新闻| 枣阳市| 邻水| 昂仁县| 时尚| 镇平县| 德安县| 沛县| 临颍县| 靖宇县| 兰坪| 四川省| 铜山县| 潼关县| 绥德县| 缙云县| 河源市| 漾濞| 出国| 长海县| 休宁县| 阜阳市| 揭东县| 伊金霍洛旗| 大方县| 聂荣县| 镇宁| 西青区| 霍林郭勒市| 常山县| 克什克腾旗| 包头市| 沛县| 广平县| 香港 | 水富县| 永新县| 徐闻县|