時(shí)間:2024-02-21 13:55作者:下載吧人氣:19
前言
分片鍵選擇不好,應(yīng)用程序就無(wú)法利用分片集群所提供的諸多優(yōu)勢(shì)。在這種情況下,插入和查詢(xún)的性能都會(huì)顯著下降。下決定時(shí)一定要嚴(yán)肅,一旦選擇了分片鍵,就必須堅(jiān)持選擇,分片鍵是不可以修改的。要讓分片鍵提供好的體驗(yàn),部分源自了解怎樣才算一個(gè)好的分片鍵。
本文將詳細(xì)介紹關(guān)于MongoDB分片鍵的選擇和案例,分享出來(lái)供大家參考學(xué)習(xí),下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
MongoDB版本:3.6
一、分片鍵類(lèi)別
1.升序片鍵
升序片鍵例如:日期時(shí)間字段、自增字段。
2.隨機(jī)分發(fā)片鍵
隨機(jī)分發(fā)片鍵例如:用戶(hù)名、郵件名、UUID、MD5值或者是其它的一些沒(méi)有規(guī)律的值的列。
3.基于位置的片鍵
基于位置的片鍵例如:IP、經(jīng)緯度、居住地址等。
二、分片策略
1.范圍分片
創(chuàng)建分片時(shí),只在主分片上創(chuàng)建了一個(gè)塊{ "username" : { "$minKey" : 1 } } -->> { "username" : { "$maxKey" : 1 } } on : rs-a Timestamp(1, 0)
。
至少得3個(gè)不同的值才會(huì)進(jìn)行塊切分,相同的值只會(huì)在一個(gè)分片塊中。比如對(duì)一個(gè)name字段進(jìn)行范圍分區(qū),如果一直往name字段插入”a”,那么它會(huì)一直存儲(chǔ)主分片的{ "username" : { "$minKey" : 1 } } -->> { "username" : { "$maxKey" : 1 } }
中,直到name出現(xiàn)三個(gè)不同的值,比如“a”,“b”,“c”這個(gè)時(shí)候就會(huì)進(jìn)行分片。當(dāng)然這只是測(cè)試,現(xiàn)實(shí)中不會(huì)對(duì)這種粗粒度的字段單獨(dú)做分片。
2.hashed分片
創(chuàng)建分片時(shí),默認(rèn)在每個(gè)分片上創(chuàng)建了兩個(gè)數(shù)據(jù)塊。但是當(dāng)前每個(gè)塊上面是沒(méi)有數(shù)據(jù)的。
3.組合分片
組合分片是比較好的一種分片的選擇,好的組合分片可以同時(shí)解決熱點(diǎn)和隨機(jī)讀IO問(wèn)題。例如:
sh.shardCollection("test.bbbb",{"username":1,"_id":1});
網(wǎng)友評(píng)論