Когда говорят интересно и показывают фигуры о прекрасном всегда хочется почесать затылок и понять что же есть на самом деле. Не скрою, я весьма воодушевился сообщением о выходе мотора баз данных WiredTiger. Он, как говорят, настолько хорош, что его взяли на вооружение в MongoDB.
Значит надо проверить.
Учинил простой тест. Создается таблица из двух полей. Ключ - строка, значение- строка. Ключ, понятное дело, primary key. Для поля "value" строится индекс. В варианте с Pg получается два индекса. (Как рулит первичным ключем WT еще надо разбираться. Но фактически WT создает только 2 файла а Pg 3(один с данными и 2 с индексами. Значит Pg будет оперировать собственно таблицей и двумя индексами, что всяко сложно)
Добавляемые строки - случайные UUID
В WT создание таблицы выглядит вот так.
Запускаем тест несколько раз и замерим время работы процедуры на пространстве возрастающих данны По итогу пяти прогонов для WiredTiger получил такие результаты в секундах
Значит надо проверить.
Учинил простой тест. Создается таблица из двух полей. Ключ - строка, значение- строка. Ключ, понятное дело, primary key. Для поля "value" строится индекс. В варианте с Pg получается два индекса. (Как рулит первичным ключем WT еще надо разбираться. Но фактически WT создает только 2 файла а Pg 3(один с данными и 2 с индексами. Значит Pg будет оперировать собственно таблицей и двумя индексами, что всяко сложно)
Добавляемые строки - случайные UUID
В WT создание таблицы выглядит вот так.
ret = session->create(session, "table:access", key_format=S,value_format=S,columns=(key, value)");
ret = session->open_cursor(session, "table:access", NULL, NULL, &cursor);
session->create(session, "index:access:value", "columns=(value)");
Тест для Wt
QTime tm;
tm.start();
for(int i=0; i<1000000 font="" i="" nbsp="">{1000000>
QByteArray keyarray=QUuid::createUuid().toString().remove('{').remove('}').toLocal8Bit();
QByteArray valuearray=QUuid::createUuid().toString().remove('{').remove('}').toLocal8Bit();
cursor->set_key(cursor, keyarray.data());
cursor->set_value(cursor, valuearray.data());
ret = cursor->insert(cursor);
}
qDebug()<<"Insert million of pairs"<
Тест для Pg
for(int i=0; i<1000000 br="" i="" nbsp=""> Command.prepare("insert into test(id, value) values(:id, :value)");
Command.bindValue(":id", QUuid::createUuid().toString());
Command.bindValue(":value", QUuid::createUuid().toString());
Command.exec();
}1000000>
WT использует отложенную модель записи, потому в PG отключим fsync.
Запускаем тест несколько раз и замерим время работы процедуры на пространстве возрастающих данны По итогу пяти прогонов для WiredTiger получил такие результаты в секундах
- 97 (Круто)
- 316 (Прилично)
- 743
- 1188
- 2193
- 500
- 690
- 1000
- 1196
- 955
Давайте не будем забывать, что WiredTiger это ядро, менеджер записей, а Postgres - полновесная база данных со всем набором вытекающих из этого сложностей.
Для очистки совести я добавил шестой миллион записей в Pg в одной транзакции. Получил результат 611.
Честно не очень понимаю что за фигуры показывают на презентации свидетели Wt и Mongo.
Вывод. Конечно я не великий спец в тестировании и со своими драными лаптями зря полез в эту тему, но мне все же кажется, что лучшее - враг хорошего.потому, сижу спокойно на Postgresql иногда поглядывая на новомодные штуки.