2011-11-24 60 views
3

假設集 「COLL」 具有索引mongos /智能路由

{ts : 1, X : 1 , Y : 1} 

Whre TS,X和Y是式NumberLong。

集合配置爲在TS分片,X

你能幫助我理解下面的查詢將如何執行?

1)無界範圍:以下查詢是針對那些託管範圍ts> 100000000的分片,還是這是一個全局查詢?

db.coll.find({ts : {$gt : 100000000}}) 

2)有界範圍:如果是這樣,那麼這個怎麼樣 - 這會成爲有針對性還是全局性的? mongos是否足夠聰明地解析查詢?

db.coll.find({$and : [{ts : {$gt : 100000000}}, {ts : {$lte : 110000000}}]}) 

3)最後 - 會發生什麼W /多重約束範圍:

db.coll.find({$or : [[{$and : [{ts : {$gt : 100000000}}, {ts : {$lte : 110000000}}]}, {$and : [{ts : {$gt : 500000000}}, {ts : {$lte : 510000000}}]}]]}) 

我無法找到任何參考範圍查詢http://www.mongodb.org/display/DOCS/Sharding+Introduction ...!

在此先感謝!

回答

2
  1. 只會打擊包含可能符合您的範圍標準的文檔的碎片。 Mongos能夠確定這是因爲您查詢分片鍵,從而知道哪些符合條件。對個別碎片的查詢是並行執行的。
  2. 與1相同)。 Mongos足夠聰明,可以知道哪些塊需要這樣做。
  3. $或者中的每個子句將被單獨評估。如果子句解析爲完全相同的查詢計劃和塊範圍,則它們將/應該組合在一起。您可以通過在分片環境中對查詢運行explain()並檢查返回的信息來檢查此問題。如果它包含「子句」對象,則表示不是$中的所有子句或可以使用相同的查詢執行計劃。

這就是理論,但mongos查詢計劃往往有點不一致。例如用「TS」片鍵和一個塊在每兩個碎片保持範圍minkey-50和其他分別爲51-maxkey的,此查詢

{$or:[{$and:[{ts:{$gt:90}}, {ts:{$lt:100}}]}, {$and:[{ts:{$gt:91}}, {ts:{$lt:100}}]}]} 

將正確地解析成一個單一的查詢到的第二塊。但是,這一個(第二子句中發現的90,而不是91)

{$or:[{$and:[{ts:{$gt:90}}, {ts:{$lt:100}}]}, {$and:[{ts:{$gt:90}}, {ts:{$lt:100}}]}]} 

實際上將導致查詢到兩個碎片,這使得很少有道理的,因爲你基本上是要求它$或兩個分句是一模一樣。基本上,嘗試使用explain()和其他監視工具來查看查詢在分片環境中的行爲方式,以確保其按預期工作。

+0

謝謝,非常有幫助。我最終還是下載了Python腳本(http://github.com/mongodb/mongo-snippets/blob/master/sharding/simple-setup.py),並使用不同的塊大小進行工具...總的來說,性能。我們投擲在mongo上的絕大多數時間序列查詢將被綁定到單個最小/最大對,所以這對我們來說非常合適。 –