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

в 23:27, , рубрики: big data, clickhouse, mongdb, mongodb, nosql, sql

Так как колоночная СУБД 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. Скорость выборки впечатляет. Данная СУБД хороший выбор для хранения данных связанных аналитической информацией.

Проект с тестами: посмотреть.

Автор: lvovgeka

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js