Mongos / интеллектуальная маршрутизация - PullRequest
3 голосов
/ 24 ноября 2011

Предположим, что коллекция "coll" имеет индекс

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

Где t, X и Y имеют тип NumberLong.

Коллекция сконфигурирована для шардинга на ts, X

Не могли бы вы помочь мне понять, как будут выполняться следующие запросы?

1) Неограниченный диапазон: будет ли следующий запрос направлен на эти диапазоны размещения шардов ts> 100000000 или это глобальный запрос?

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

2) Ограниченный диапазон: если да, то как насчет этого - будет ли он целевым или глобальным?Достаточно ли умен монгос, чтобы разобрать запрос?

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

3) Наконец - что происходит с несколькими ограниченными диапазонами:

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...!

Заранее спасибо!

1 Ответ

2 голосов
/ 25 ноября 2011
  1. Ударяет только те осколки, которые содержат документы, которые могут соответствовать вашим критериям диапазона.Mongos может определить это, потому что вы запрашиваете ключ осколка и, следовательно, знаете, какие из них имеют право.Запросы к частным осколкам выполняются параллельно.
  2. То же, что 1).Mongos достаточно умен, чтобы знать, какие куски ударить для этого.
  3. Каждый пункт в $ or будет оцениваться отдельно.Если пункты соответствуют одному и тому же плану запроса и диапазону фрагментов, они будут / должны быть объединены.Вы можете проверить это, запустив объяснение () для вашего запроса в защищенной среде и следя за возвращенной информацией.Если он содержит объект «пункты», это означает, что не все предложения в вашем $ или могут использовать один и тот же план выполнения запроса.

Это теория, но планы запросов 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}}]}]}

на самом деле приведет к запросу к обоим шардам, что не имеет большого смысла, так как вы в основном просите его к $ или двум предложениямэто точно так же.По сути, попробуйте использовать объяснение () и другие инструменты мониторинга, чтобы увидеть, как ваши запросы ведут себя в шардирующей среде, чтобы убедиться, что они работают должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...