Так как колоночная СУБД 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:
Вставка заняла ~8289 ms.
ClickHouse:
Вставка заняла ~17375 ms.
Итого 17375-8289 = 9086 ms. MongoDB быстрее вставляет данные примерно в 2 раза чем ClickHouse.
— Выбираем данные
Выбирать будем сколько раз месяц «December» повторяется в таблице (коллекции).
MongoDB. Запрос:
db.testCollections.aggregate([
{
"$group" : {
_id : "$month", count:{
$sum:1
}
}
}
])
Результат 300 ms:
ClickHouse. Запрос:
SELECT month, count() AS count FROM test GROUP BY month;
Результат 42 ms:
Итого 300-42 = 258 ms. ClickHouse примерно в 7 раз быстрее выбирает данные с группировкой чем MongoDB.
Давайте сделаем еще простой select с limit 20.
MongoDB:
db.testCollections.find().limit(20);
Результат 13 ms:
ClickHouse:
SELECT * FROM test limit 20;
Результат 24 ms:
Итого при select с limit 20 ClickHouse затратил примерно в 2-е больше времени чем MongoDB.
Давайте умножим данные в 10 раз и повторим тест на выборку данных.
Объем данных: 5 млн. записей
В данном тесте будем выбирать данные (то есть данные описанные выше уже вставлены в обе БД).
Результат count в обеих БД:
— Выбираем данные
Те же запросы с группировкой. MongoDB:
Время выборки 3145 ms.
ClickHouse:
Время выборки 112 ms.
ClickHouse при данном объеме данных в десятки раз быстрее. Обычный select с limit 20 прошел так же как и при 500 тыс. записей.
Давайте еще умножим данные в 10 раз и повторим тест на выборку данных. (что-то я вставил на 500 тыс. записей больше, будет 50 500 000 записей).
Объем данных: 50,5 млн. записей
Результат count в обеих БД:
— Выбираем данные
Те же запросы с группировкой. MongoDB:
Клиент mongodb для nodejs отвалился через 35009 ms. Вот результат из GUI клиента для работы с MongoDB:
Время выборки 1m 12.571 s.
ClickHouse:
Время выборки 931 ms.
ClickHouse явно лидирует.
Резюме
ClickHouse отлично подходит для проектов с BigData. Скорость выборки впечатляет. Данная СУБД хороший выбор для хранения данных связанных аналитической информацией.
Проект с тестами: посмотреть.
Автор: lvovgeka