К основному содержимому

ClickHouse на VDS: аналитика без нагрузки на MySQL

MySQL / MariaDB · 18.10.2026 · 5 мин чтения
Иллюстрация к статье «ClickHouse на VDS: аналитика без нагрузки на MySQL»

ClickHouse — колоночная СУБД для аналитических запросов: подсчёт событий, разбор логов, агрегация метрик за длительные периоды. В каталоге ZevsHost нет отдельной статьи про неё, хотя вопрос «куда девать логи и события, чтобы не нагружать основную MySQL-базу» встречается часто. Разберём, когда ClickHouse оправдан рядом с MySQL на одном VDS и чего от него не стоит ждать.

Когда ClickHouse нужен, а когда MySQL достаточно

ClickHouse выигрывает там, где нужно просканировать миллионы строк и посчитать агрегат — сумму, количество уникальных посетителей за месяц, разбивку по часам. Колоночное хранение читает только нужные столбцы, а не всю строку целиком, поэтому такие запросы на порядки быстрее, чем на обычной строковой таблице InnoDB с тем же объёмом данных.

Если сайту хватает выборки «последние 50 заказов клиента» или «карточка товара по id», ClickHouse не нужен — для точечных выборок по первичному ключу и для записей с частыми точечными обновлениями MySQL остаётся правильным выбором; разницу между реляционными СУБД подробнее разбирает статья MySQL или PostgreSQL: как выбрать СУБД.

Как ClickHouse хранит данные

Таблицы в ClickHouse создают с движком семейства MergeTree — именно он отвечает за сортировку данных по ключу и фоновое слияние мелких кусков в крупные.

CREATE TABLE events
(
    event_date Date,
    event_time DateTime,
    user_id UInt64,
    event_type String
)
ENGINE = MergeTree()
ORDER BY (event_date, user_id);

Данные физически лежат отсортированными по ключу ORDER BY, а не по порядку вставки, поэтому выборка по диапазону дат читает только нужные куски с диска, а не всю таблицу.

Как перенести данные из MySQL

Прямой перенос построчными INSERT из PHP-скрипта работает, но создаёт в ClickHouse множество мелких кусков данных, которые потом фоново сливаются и нагружают диск сильнее, чем сама вставка.

  • Вставлять данные партиями: одной вставкой отправлять от 1 000 до 100 000 строк — чем крупнее партия, тем меньше кусков должен слить фон слияния, а конкретное число зависит от размера строки и частоты вставок.
  • Использовать табличный движок MySQL или словарь с источником MySQL для чтения справочников без дублирования данных на обеих сторонах.
  • Для потока событий — накапливать события в файле или в очереди и импортировать пакетами по расписанию, а не писать в ClickHouse из каждого запроса пользователя напрямую.
  • Для обновления и удаления строк использовать мутации (ALTER TABLE ... UPDATE/DELETE) и помнить, что они выполняются асинхронно в фоне, а не мгновенно, как UPDATE в InnoDB.
  • Отключить вставку по одной строке из веб-приложения на проде — даже редкие прямые INSERT из обработчика запроса создают нагрузку, непропорциональную объёму данных.

ClickHouse не заменяет транзакционную базу — для неё нет многотабличных транзакций и внешних ключей, которые есть в MySQL и в PostgreSQL; принципы выбора реляционной СУБД под транзакционную нагрузку описаны в статье про настройку PostgreSQL на VPS.

Ресурсы, которые понадобятся на VDS

ClickHouse активно использует оперативную память для кэша несжатых блоков и для промежуточных структур при агрегации, а также постоянно пишет на диск при фоновом слиянии кусков — на медленном сетевом диске это создаёт заметную нагрузку по I/O даже без запросов пользователей.

ПараметрInnoDB (MySQL)MergeTree (ClickHouse)
Хранение строкПо строкам, вся строка целикомПо столбцам, отдельно каждый столбец
Сильная сторонаТочечные выборки и частые изменения строкАгрегаты по миллионам строк
Обновление строкиМгновенное, в рамках транзакцииАсинхронная мутация, без транзакций
Нагрузка на дискСлучайные чтения и записиПоследовательные чтения, фоновые слияния

Сколько памяти и дискового пространства нужно под ClickHouse на конкретном VDS, зависит от объёма исторических данных и от того, сколько столбцов участвует в типичном запросе — для контроля свободного места и нагрузки на диск подходит обычный мониторинг ресурсов VDS, настроенный на отдельный раздел под базу.

Как следить за ClickHouse на сервере

Сама СУБД пишет собственный лог в системные таблицы — system.query_log хранит текст и время выполнения каждого запроса, а system.merges показывает, какие куски сливаются фоном прямо сейчас.

Если фоновые слияния не успевают за потоком вставок, число кусков в таблице растёт, а новые запросы на чтение замедляются — это первый признак того, что размер партии вставки нужно увеличить или перенести ClickHouse на диск с более высокой скоростью записи.

Частые вопросы

Можно ли поставить ClickHouse и MySQL на один VDS?

Да, при достаточном объёме оперативной памяти для обоих процессов это обычная практика: MySQL обслуживает транзакционную нагрузку сайта, а ClickHouse — аналитику и логи, подключённые отдельным процессом чтения. Важно развести их по разным дискам или хотя бы разделам, если дисковая нагрузка от слияний в ClickHouse мешает MySQL.

Подходит ли ClickHouse для хранения заказов интернет-магазина?

Нет, для заказов нужны транзакции, внешние ключи и мгновенные точечные обновления статуса — это задача MySQL или PostgreSQL. ClickHouse годится для витрины аналитики по тем же заказам: сколько заказов в час, средний чек по категориям, но не для самой записи, которая должна остаться в реляционной базе.

Нужен ли ClickHouse, если логов и событий немного?

Если объём логов измеряется тысячами записей в сутки, обычная таблица InnoDB с правильными индексами справится без проблем, а разворачивать отдельную аналитическую СУБД смысла нет — ClickHouse оправдан, когда счёт идёт на миллионы строк и агрегатные запросы к InnoDB начинают выполняться заметно дольше точечных.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке