雖然我碰到下面的斷言來瀏覽MongoDB的分片教程:查詢基於片鍵擊中多個碎片
「如果你在查詢中使用片鍵,它會打少數碎片,經常只有一個「
另一方面,從我之前關於分片的一些基本知識來看,如果查詢是在Shard Key上觸發的,mongos路由服務可以唯一地指出目標分片。我的問題是 - 在什麼情況下,基於分片鍵的查詢有可能觸及多個分片?
雖然我碰到下面的斷言來瀏覽MongoDB的分片教程:查詢基於片鍵擊中多個碎片
「如果你在查詢中使用片鍵,它會打少數碎片,經常只有一個「
另一方面,從我之前關於分片的一些基本知識來看,如果查詢是在Shard Key上觸發的,mongos路由服務可以唯一地指出目標分片。我的問題是 - 在什麼情況下,基於分片鍵的查詢有可能觸及多個分片?
使用分片鍵的查詢將以分片的子集爲目標來檢索您的查詢的數據,但根據查詢和數據分佈情況,這可能少至一個或多至所有分片。
借用上shard keys從MongoDB的文檔一個有用的圖像:
MongoDB使用分片鍵自動數據劃分成稱爲塊片鍵值的邏輯範圍。每個塊默認代表大約64MB的數據,並且與當前擁有該分片鍵值範圍的單個分片相關聯。塊數爲balanced across available shards,並且不存在相鄰塊在同一分片上的期望。
如果查詢屬於單個區塊內的分片鍵值(或值的範圍),那麼mongos
肯定可以定位到單個分片。
假設塊範圍如上圖所示:
// Targeted query to the shard with Chunk 3
db.collection.find({ x: 50 })
// Targeted query to the shard with Chunk 4
db.collection.find({x: { $gte: 200} })
如果查詢跨越多個區塊範圍內,mongos
可以針對碎片包含有關文件的子集:
// Targeted query to the shard(s) with Chunks 3 and 4
db.collection.find({x: { $gte: 50} })
兩個本例中的塊將位於同一個碎片或兩個不同的碎片上。您可以查看explain results以查詢有關訪問哪些碎片的更多信息。
它也可以構造查詢,將需要所有碎片數據(例如,基於大範圍的碎片的鍵值):
// Query includes data from all chunk ranges
db.collection.find({x: { $gte: -100} })
注:以上信息描述基於範圍的分片。 MongoDB還支持基於散列的分片密鑰,這些密鑰將(在散列之後)(有意地)將相鄰的分片密鑰值分佈到不同的塊範圍。散列分片鍵上的範圍查詢預計包含多個分片。請參閱:Hashed vs Ranged Sharding。