Pull to refresh

Небольшое сравнение производительности СУБД «MongoDB vs ClickHouse»

SQL *NoSQL *MongoDB *
Sandbox
Так как колоночная СУБД ClickHouse (внутренняя разработка Яндекс) стала доступна каждому, решил использовать эту СУБД заместо MongoDB для хранения аналитических данных. Перед использованием сделал небольшой тест производительности и хочу поделиться результатами с IT сообществом.

Для теста использовал nodejs. Библиотеки для СУБД под nodejs (драйвера):
ClickHouse
MongoDB

Тестировал на железе:
i5-3570
8gb DDR3 1333 MHz Kingston
CSSD-N128GB3-BK
OS: Linux Mint 18

Перед началом теста поставил ClickHouse и MongoDB со стандартными настройками. Создал коллекцию в MongoDB «testCollections» и таблицу в ClickHouse «test» с движком MergeTree. Вот структура таблицы test в ClickHouse (в MongoDB структура динамическая):

create table test (event_date Date DEFAULT toDate(event_time), event_time DateTime DEFAULT now(), number UInt64, text String, month String) engine = MergeTree(event_date, (event_time, number, text, month), 8192);

Поля event_* для дат.
number — для случайного числа.
text — для случайного текста.
month — для случайного месяца.
В MongoDB буду тоже вставлять подобные данные с такой же структурой.

И вот можно начинать тест. Тестовые данные буду делать на «лету», то есть вставлять данные и смотреть результаты выполнения вставки в миллисекундах. В тесте не будет update так как в ClickHouse нет данной операции.

Структура данных для вставки:

MongoDB
[
   { 
    event_date: '2017-01-29',
    event_time: '2017-01-29 16:00:40',
    number: 3,
    text: 'sequi voluptatibus labore',
    month: 'December' 
   },
  ...
]

ClickHouse
[
  [
    '2017-01-29',
    '2017-01-29 16:00:40',
    1,
    'Et omnis consequatur id eaque suscipit error sed at. Eos ut omnis corporis unde. Tenetur ...',
    'July' 
  ],
...
] 

Итак начнем.

Объем данных: 500 тыс. записей


В данном тесте будем вставлять и выбирать данные.

— Вставка в базу данных.

MongoDB:

image

Вставка заняла ~8289 ms.

ClickHouse:

image

Вставка заняла ~17375 ms.

Итого 17375-8289 = 9086 ms. MongoDB быстрее вставляет данные примерно в 2 раза чем ClickHouse.

— Выбираем данные

Выбирать будем сколько раз месяц «December» повторяется в таблице (коллекции).

MongoDB. Запрос:

db.testCollections.aggregate([
         {
            "$group" : {
                _id : "$month", count:{
                    $sum:1
                }
            }
        }
 ])

Результат 300 ms:

image

ClickHouse. Запрос:

SELECT month, count() AS count FROM test GROUP BY month;

Результат 42 ms:

image

Итого 300-42 = 258 ms. ClickHouse примерно в 7 раз быстрее выбирает данные с группировкой чем MongoDB.

Давайте сделаем еще простой select с limit 20.

MongoDB:

 db.testCollections.find().limit(20);


Результат 13 ms:

image

ClickHouse:

SELECT * FROM test limit 20;

Результат 24 ms:

image

Итого при select с limit 20 ClickHouse затратил примерно в 2-е больше времени чем MongoDB.

Давайте умножим данные в 10 раз и повторим тест на выборку данных.

Объем данных: 5 млн. записей


В данном тесте будем выбирать данные (то есть данные описанные выше уже вставлены в обе БД).
Результат count в обеих БД:

image

— Выбираем данные

Те же запросы с группировкой. MongoDB:

image

Время выборки 3145 ms.

ClickHouse:

image

Время выборки 112 ms.

ClickHouse при данном объеме данных в десятки раз быстрее. Обычный select с limit 20 прошел так же как и при 500 тыс. записей.

Давайте еще умножим данные в 10 раз и повторим тест на выборку данных. (что-то я вставил на 500 тыс. записей больше, будет 50 500 000 записей).

Объем данных: 50,5 млн. записей


Результат count в обеих БД:

image

— Выбираем данные

Те же запросы с группировкой. MongoDB:

Клиент mongodb для nodejs отвалился через 35009 ms. Вот результат из GUI клиента для работы с MongoDB:

image

Время выборки 1m 12.571 s.

ClickHouse:

image

Время выборки 931 ms.

ClickHouse явно лидирует.

Резюме


ClickHouse отлично подходит для проектов с BigData. Скорость выборки впечатляет. Данная СУБД хороший выбор для хранения данных связанных аналитической информацией.

Проект с тестами: посмотреть.
Tags:
Hubs:
Total votes 54: ↑31 and ↓23 +8
Views 18K
Comments Comments 22