日韩小视频-日韩久久一区二区三区-日韩久久一级毛片-日韩久久久精品中文字幕-国产精品亚洲精品影院-国产精品亚洲欧美云霸高清

下載吧 - 綠色安全的游戲和軟件下載中心

軟件下載吧

當前位置:軟件下載吧 > 數據庫 > DB2 > 詳解MongoDB數據庫的范圍片鍵和哈希片鍵

詳解MongoDB數據庫的范圍片鍵和哈希片鍵

時間:2024-02-07 12:09作者:下載吧人氣:20

01 片鍵

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

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

chunk1:  age  0~20

chunk2:  age  20~40   

chunk3:age  40~60

chunk4:age  60~80

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

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

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

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

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

02 范圍片鍵(遞增片鍵)

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

詳解MongoDB數據庫的范圍片鍵和哈希片鍵

這中分片方式是MongoDB默認的分片方式,它有好處也有壞處。

好處:

    可以高效的讀取連續范圍內的目標文檔。如果你使用范圍查詢,則可以比較快速的拿到所有的結果值。因為數據所在的數據chunk比較少。

壞處:

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

詳解MongoDB數據庫的范圍片鍵和哈希片鍵

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

1、數據的基數比較大

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

3、非單調變化的分片(如果單調寫,則會分到同一個塊里面,容易達到chunk割裂的條件,產生chunk的搬運)

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

詳解MongoDB數據庫的范圍片鍵和哈希片鍵

就是比較均勻的寫入到了數據塊中。

03 哈希片鍵

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

    使用哈希索引,我們寫入數據之后,對應寫入數據塊的圖示可能如下:

詳解MongoDB數據庫的范圍片鍵和哈希片鍵

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

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

哈希值得計算,是由MongoDB來負責的,不是應用程序負責的

作為哈希片鍵的索引字段應該有如下特點:

1、具有大量不同的值

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

詳解MongoDB數據庫的范圍片鍵和哈希片鍵

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

在實際生產環境中,我們需要結合自己的需求來確定使用哪種類型的片鍵,再次強調,在設定某個字段作為片鍵之前,需要先在當前字段創建對應類型的索引,或者創建一個以當前字段開頭的聯合索引。否則設定片鍵的語句會報錯。

下面是分片創建從無到有的過程舉例:

1、創建表,只有一個字段name,并插入數據
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、查看數據
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、允許數據庫分片
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字段創建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字段作為片鍵創建哈希分片
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,技術文檔,數據庫,MongoDB

相關下載

查看所有評論+

網友評論

網友
您的評論需要經過審核才能顯示

熱門閱覽

最新排行

公眾號

主站蜘蛛池模板: 国产一级片视频 | 成人性动漫高清免费观看网址 | 国产精品亚洲精品一区二区三区 | 欧美日韩亚洲国内综合网俺 | jk制服福利在线播放 | 日本又黄又爽又免费 | 久久久久久国产精品免费免 | 新版天堂资源中文8在线 | 黄色三级网站免费 | yy毛片| 深夜福利网站 | 颜值超高的女神啪啪 | 中文在线亚洲 | 亚洲精品国产一区二区图片欧美 | 一级欧美一级日韩片 | 国产伦精品一区二区三区精品 | 久久久香蕉 | 精品一区二区三区免费爱 | 老司机精品影院一区二区三区 | 888米奇在线视频四色 | 边接电话边做国语高清对白 | 国产一级毛片在线 | 女bbbbxxxx毛片视频0 | 国产成人免费高清激情视频 | jk制服福利在线播放 | 成人精品亚洲 | 亚洲日本视频 | 国产性精品 | 加勒比色 | 日本精品视频一区二区三区 | 在线免费亚洲 | 国内精品久久久久影院网站 | 99j久久精品久久久久久 | 手机国产精品一区二区 | 在线观看视频一区二区三区 | 欧美成人午夜毛片免费影院 | 亚洲欧美男人天堂 | 免费看一级毛片欧美 | 国产免费一级精品视频 | 久草在线免费资源站 | 亚洲综合日韩欧美一区二区三 |