Прежде чем продолжить сравнивать базы - вернемся к бенчмаркам разработчиков Clickhouse
Эти тесты охватывают наиболее распространённые сценарии работы с данными:
- Анализ кликов и веб-трафика
- Веб-аналитика и пользовательское поведение
- Обработка машинно-генерируемых данных
- Работа со структурированными логами и событиями
- Ad-hoc аналитика и дашборды реального времени
Методология сравнения🧪
Для объективного сопоставления ClickHouse и MySQL мы взяли 10 миллионов строк из этого датасета и отобрали запросы, которые наиболее наглядно демонстрируют разницу между двумя подходами.
Хотя бенчмарк и ограничен этими двумя базами данных, вы можете обобщить концепцию на другие строчные и колоночные СУБД.
Процесс тестирования⚙️
- Создаётся база данных
- Создаётся таблица с определённым DDL
- Данные (hits.tsv) загружаются в таблицу, и измеряется время загрузки
- Выполняются запросы, и измеряется время выполнения каждого запроса
Тестовые запросы:📋
1. SELECT COUNT(*) FROM analytics_events; [OLAP]
2. SELECT SUM(event_value), COUNT(*), AVG(processing_time) FROM analytics_events; [OLAP]
3. Сложный GROUP BY с фильтрами по дате и категории события [OLAP]
4. Агрегация по 2 полям с сортировкой по частоте [OLAP]
5. Точечный SELECT по ID пользователя [OLTP]
6. SELECT нескольких полей по ID транзакции [OLTP]
7. UPDATE одной строки в таблице пользователей [OLTP]
1. Загрузка данных⬇️
• ClickHouse: 65 секунд
• MySQL: 11 минут 35 секунд
• Соотношение: MySQL медленнее в 10.7 раза
ClickHouse загружает данные быстрее благодаря LSM-деревьям и разреженным индексам, но работает эффективнее с пакетными вставками, а не с отдельными строками — он создаёт неизменяемые блоки данных и не оптимизирован для частых точечных изменений..
2. Размер таблицы на диске💾
ClickHouse: 1.3 GiB
MySQL: 6.32 GiB
Соотношение: MySQL занимает в 4.86 раза больше места
Колоночная структура обеспечивает возможность сжатия данных, что недоступно в строчных базах данных.
3. Выполнение запросов на чтение📖
Запрос 1: SELECT COUNT(*) FROM analytics_events;
ClickHouse: 0.005 сек
MySQL: 7.79 сек
Соотношение: ×1558 - ClickHouse быстрее
Запрос 2: SELECT SUM(event_value), COUNT(*), AVG(processing_time) FROM analytics_events;
ClickHouse: 0.030 сек
MySQL: 16.0 сек
Соотношение: ×533 - ClickHouse быстрее
Запрос 3: Сложный GROUP BY с фильтрами по дате
ClickHouse: 0.193 сек
MySQL: 4.35 сек
Соотношение: ×22.5 - ClickHouse быстрее
Запрос 4: Агрегация по двум полям с сортировкой
ClickHouse: 2.600 сек
MySQL: 180.93 сек (≈3 минуты)
Соотношение: ×69.6 - ClickHouse быстрее
Запрос 5: Точечный SELECT по конкретным ID
ClickHouse: 0.01 сек
MySQL: <0.001 сек
Для точечных запросов MySQL показывает лучшее время
Запрос 6: SELECT нескольких полей по конкретным ID
ClickHouse: 0.011 сек
MySQL: <0.001 сек
Для точечных запросов MySQL показывает лучшее время
Разреженные индексы и колоночная структура ClickHouse превзошли MySQL во всех OLAP-запросах (номера 1-4). Вот почему BI-аналитики и аналитики данных были бы более чем довольны ClickHouse для своих ежедневных отчетов.
Однако MySQL выигрывает битву, когда речь идет об OLTP-запросах (номера 5 и 6). B-деревья лучше для точечных запросов, где требуются короткие транзакции с небольшим количеством строк.
4. Выполнение обновлений🔄
Для запроса на обновление в ClickHouse нужно выполнить другой запрос, он не поддерживает обновления в традиционном смысле, будем использовать ALTER:
Кроме того, ClickHouse применяет обновление асинхронно. Чтобы получить результат немедленно, нужно выполнить команду оптимизации
ALTER TABLE user_sessions UPDATE is_active = 0 WHERE user_id = 12345 AND session_date = '2024-01-15' AND session_token = 'abc123' AND device_id = 'device001';
OPTIMIZE TABLE user_sessions FINAL;
Запрос: 7
ClickHouse: 26 сек
MySQL: <0.001 сек
ClickHouse снова проигрывает в реальных обновлениях (и аналогично удалениях) по сравнению с MySQL.
Ну и напоследок у нас остается тема - применение CDC из MySQL в ClickHouse
Ждите апдейтов :)👀
#ClickHouse #БазыДанных #Производительность #Сравнение #Бенчмарки #Оптимизация #MySQL