Проблемы производительности ограниченных коллекций
Я делаю несколько тестов, чтобы увидеть, какую пропускную способность я могу получить от Mongodb. В документации сказано, что закрытые коллекции - самый быстрый вариант. Но я часто нахожу, что могу писать в обычную коллекцию гораздо быстрее. В зависимости от точного теста, я часто могу получить вдвое большую пропускную способность с обычной коллекцией.
Я что-то пропустил? Как мне устранить это?
У меня есть очень простая программа на C++, которая максимально быстро записывает в коллекцию около 64 000 документов. Я записываю общее время и время ожидания базы данных. Если я не изменю ничего, кроме имени коллекции, я вижу четкую разницу между ограниченными и обычными коллекциями.
> use tutorial
switched to db tutorial
> db.system.namespaces.find()
{ "name" : "tutorial.system.indexes" }
{ "name" : "tutorial.persons.$_id_" }
{ "name" : "tutorial.persons" }
{ "name" : "tutorial.persons.$age_1" }
{ "name" : "tutorial.alerts.$_id_" }
{ "name" : "tutorial.alerts" }
{ "name" : "tutorial.capped.$_id_" }
{ "name" : "tutorial.capped", "options" : { "create" : "capped", "capped" : true, "size" : 100000000 } }
> db.alerts.stats()
{
"ns" : "tutorial.alerts",
"count" : 400000,
"size" : 561088000,
"avgObjSize" : 1402.72,
"storageSize" : 629612544,
"numExtents" : 16,
"nindexes" : 1,
"lastExtentSize" : 168730624,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 12991664,
"indexSizes" : {
"_id_" : 12991664
},
"ok" : 1
}
> db.capped.stats()
{
"ns" : "tutorial.capped",
"count" : 62815,
"size" : 98996440,
"avgObjSize" : 1576,
"storageSize" : 100003840,
"numExtents" : 1,
"nindexes" : 1,
"lastExtentSize" : 100003840,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 2044000,
"indexSizes" : {
"_id_" : 2044000
},
"capped" : true,
"max" : 2147483647,
"ok" : 1
}
Версия для Linux: 3.4.11-1.fc16.x86_64
версия для Монго: db версия v2.2.2, pdfile версия 4.5
Это выделенный компьютер, который не выполняет ничего, кроме запуска сервера Mongodb и моего тестового клиента. Машина смехотворно одолела для этого теста.
2 ответа
Я вижу проблему. Веб-страница, которую я цитировал выше, говорит, что ограниченная коллекция "без индекса" будет предлагать высокую производительность. Но…
http://docs.mongodb.org/manual/core/indexes/ говорится: "До версии 2.2 у ограниченных коллекций не было поля _id. В 2.2 все ограниченные коллекции имеют поле _id, кроме тех, которые находятся в локальной базе данных".
Я создал другую версию своего теста, которая записывает в ограниченную коллекцию в локальной базе данных. Конечно, эта коллекция не имела никаких индексов, и моя пропускная способность была намного выше!
Возможно, обзор укупоренных коллекций по адресу http://docs.mongodb.org/manual/core/capped-collections/ должен прояснить этот момент.
Закрытые коллекции гарантируют сохранение порядка вставки. В результате для запросов не требуется индекс для возврата документов в порядке вставки. Без этих издержек индексации они могут поддерживать более высокую пропускную способность вставки.
Согласно приведенному выше определению, если у вас нет вставки индекса в ограниченные коллекции, необязательно выполнять быстрее, чем вставку в обычную коллекцию. Поэтому, если у вас нет никаких индексов, и если у вас нет других причин использовать ограниченную коллекцию, такую как кэширование, показ последних n элементов, то я бы посоветовал вам использовать обычные коллекции.
Ограниченные коллекции гарантируют, что порядок вставки идентичен порядку на диске (естественный порядок), и запрещают обновления, которые увеличивают размер документа. Ограниченные коллекции допускают только обновления, которые соответствуют оригинальному размеру документа, что гарантирует, что документ не изменит свое местоположение на диске.