Проблемы производительности ограниченных коллекций

Я делаю несколько тестов, чтобы увидеть, какую пропускную способность я могу получить от 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 элементов, то я бы посоветовал вам использовать обычные коллекции.

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

Другие вопросы по тегам