Что заставляет вас говорить, что запросы касались только одного фрагмента? Если результат достиг 100 000 строк, это звучит маловероятно. Максимальный размер фрагмента составляет 64 Мб, и если ваши объекты не будут крошечными, многие из них не подойдут. Монго, скорее всего, разделил ваши куски и раздал их.
Я думаю, вам нужно рассказать нам больше о том, что вы делаете, и о форме ваших данных. Вы запрашивали и загружали одновременно? Вы имеете в виду осколок, когда говорите кусок? Ваш ключ шарда - это что-то еще, кроме _id
? Делаете ли вы какие-либо обновления во время запроса данных?
Существует два основных фактора, влияющих на производительность в Mongo: глобальная блокировка записи и использование файлов, отображаемых в память. Файлы с отображенной памятью означают, что вам действительно нужно подумать о своих шаблонах использования, а глобальная блокировка записи делает ошибки страниц очень серьезными.
Если вы запрашиваете что-то повсюду, где ОС будет трудно выкладывать и выводить вещи, это может быть особенно больно, если ваши объекты крошечные, потому что целые страницы должны быть загружены только для доступа к небольшим частям, партиям оперативной памяти будет потрачено впустую. Если вы выполняете много операций записи, которые блокируют операции чтения (но обычно это не так плохо, поскольку записи выполняются довольно последовательно), но если вы выполняете обновления, вы можете забыть о производительности любого типа, обновления блокируют весь сервер базы данных для значительное количество времени.
Запустите mongostat
, пока вы выполняете свои тесты, он может многое вам сказать (запустите mongostat --discover | grep -v SEC
, чтобы увидеть метрики для всех мастеров осколков, не забудьте включить --port
, если ваш mongos
не работает на 27017).
Обращаясь к вопросам в вашем обновлении: было бы здорово, если бы Монго физически держал куски вместе, но это не так. Одна из причин в том, что шардинг - это слой поверх mongod
, и mongod
не полностью осознает, что это шард. Это серверы конфигурации и процессы mongos
, которые знают о ключах шарда и какие куски существуют. Таким образом, в текущей архитектуре mongod
даже не имеет информации, которая потребовалась бы для хранения фрагментов на диске. Проблема еще глубже: формат диска Монго не очень продвинутый. Он по-прежнему (начиная с версии 2.0) не имеет оперативного сжатия (хотя сжатие улучшилось в версии 2.0), он не может сжимать фрагментированную базу данных и по-прежнему обслуживать запросы. К сожалению, Монго предстоит пройти долгий путь, прежде чем он способен на то, что вы предлагаете.
Лучшее, что вы можете сделать на этом этапе, - это убедиться, что вы записываете данные по порядку, так что порции будут записываться последовательно. Вероятно, это поможет, если вы заранее создадите все чанки, чтобы данные не перемещались балансировщиком. Конечно, это возможно только в том случае, если у вас есть все данные заранее, и это маловероятно.