Query-Performance
MongoDB - 按_id分片時的查詢性能
當我們通過 MongoDB 的 _id 欄位對集合進行分片時,我們可以實現最均勻的分佈,但是文件表明由於使用了分散聚集模式,查詢性能不能很好地擴展。
在 Elasticsearch 中,除了對這些分片的查詢是同時執行的之外,還會發生類似的行為。MongoDB也是這樣嗎?或者 Mongos 是否將查詢分散到每個分片並按順序收集結果,這就是它效率低下的原因?我無法在任何地方提供有關其內部工作方式的任何詳細資訊
答案是肯定的。
分散查詢是您使用 _id 作為分片鍵時得到的。查詢被發送到所有分片,並從它們“收集”結果。正如這裡所說
如果查詢不包含分片鍵,則 mongos 必須將查詢定向到集群中的所有分片。這些分散聚集查詢可能效率低下。在較大的集群上,分散聚集查詢對於正常操作是不可行的。
請參閱 mongos廣播操作:
mongos 實例向集合的所有分片廣播查詢,除非 mongos 可以確定哪個分片或分片子集儲存此數據。
mongos 收到所有分片的響應後,合併數據並返回結果文件。廣播操作的性能取決於集群的整體負載,以及網路延遲、單個分片負載和每個分片返回的文件數量等變數。在可能的情況下,優先選擇導致目標操作的操作,而不是導致廣播操作的操作。
看起來,mongos 會同時查詢分片。至少術語“廣播”清楚地表明了這一點。查詢的響應時間主要取決於我假設的所有分片的最慢響應。