1. Введение в архитектуру ClickHouse, установка и основы работы с SQL
Введение в архитектуру ClickHouse, установка и основы работы с SQL
Добро пожаловать в курс «ClickHouse: От новичка до Senior архитектора». Мы начинаем наше путешествие с фундаментальных основ. Если вы привыкли работать с классическими реляционными базами данных, такими как PostgreSQL или MySQL, то ClickHouse заставит вас пересмотреть многие привычные паттерны проектирования.
В этой статье мы разберем, почему ClickHouse настолько быстр, чем колоночная СУБД отличается от строковой, как установить сервер и выполнить свои первые SQL-запросы.
Что такое ClickHouse и зачем он нужен?
ClickHouse — это колоночная система управления базами данных (СУБД) для онлайн-обработки аналитических запросов (OLAP). Она была разработана в Яндексе для задачи Яндекс.Метрики — второго по величине веб-аналитического сервиса в мире.
Главная особенность ClickHouse — способность обрабатывать петабайты данных и отвечать на аналитические запросы за миллисекунды. Там, где обычная база данных будет «думать» минуты или часы, ClickHouse выдает результат мгновенно.
OLAP против OLTP
Чтобы понять архитектуру ClickHouse, нужно разграничить два типа нагрузок:
Архитектура: Колоночное хранение
Секрет скорости ClickHouse кроется в том, как он хранит данные на диске. Большинство традиционных БД хранят данные построчно. Это значит, что все данные одной строки (ID, Имя, Дата, Сумма) лежат на диске рядом.
ClickHouse хранит данные поколоночно. Значения из колонки «Дата» хранятся вместе, значения из колонки «Сумма» — отдельно.
Почему это эффективно?
Представим, что у нас есть таблица с 100 колонками и миллиардом строк. Нам нужно посчитать среднюю сумму заказа.
В строковой БД (MySQL) системе придется прочитать с диска всю строку целиком (все 100 колонок), даже если нам нужна только одна. Это создает огромную нагрузку на ввод-вывод (I/O).
Математически время чтения данных можно выразить формулой:
Где — время чтения, — объем считываемых данных, — скорость чтения диска.
В колоночной БД (ClickHouse) мы читаем только файлы, относящиеся к колонке «Сумма». Если эта колонка занимает 1% от объема таблицы, то уменьшается в 100 раз, и, следовательно, также уменьшается в 100 раз.
Сжатие данных
Второй важный аспект — сжатие. Поскольку в одной колонке хранятся однотипные данные (например, только даты или только числа), они сжимаются гораздо лучше, чем разнородные данные в строке. ClickHouse использует различные кодеки (LZ4, ZSTD, Delta, Gorilla), что позволяет уменьшить объем данных на диске в 10–100 раз по сравнению с сырыми данными.
Векторное выполнение запросов
ClickHouse не просто хранит данные по колонкам, он и обрабатывает их векторами (батчами). Вместо того чтобы вызывать функцию сложения для каждой строки отдельно (что создает оверхед на вызов функции), ClickHouse загружает массив данных в процессор и использует SIMD-инструкции (Single Instruction, Multiple Data).
Установка ClickHouse
ClickHouse работает только на Linux (нативная поддержка) и macOS (через Docker или специальные сборки). Для Windows рекомендуется использовать WSL 2 или Docker.
Самый простой и безопасный способ начать эксперименты — использовать Docker. Это изолирует среду и позволит вам быстро запустить сервер.
Запуск через Docker
Убедитесь, что у вас установлен Docker, и выполните следующую команду в терминале:
Разберем флаги:
* -d: запуск в фоновом режиме.
* --name: имя контейнера.
* --ulimit nofile: ClickHouse требует много открытых файловых дескрипторов, так как работает с большим количеством файлов колонок.
* -p 8123:8123: HTTP порт (для JDBC, веб-интерфейсов).
* -p 9000:9000: Нативный TCP порт (для clickhouse-client).
Чтобы подключиться к запущенному серверу и начать писать SQL, используйте команду:
Вы увидите приглашение командной строки :) — это фирменный знак ClickHouse.
Основы SQL в ClickHouse
Язык запросов в ClickHouse — это диалект SQL. Он очень похож на стандартный ANSI SQL, но имеет свои расширения и ограничения.
Создание базы данных
Создание таблицы и движок MergeTree
В ClickHouse концепция «движков таблиц» (Table Engines) является ключевой. От выбора движка зависит, где и как хранятся данные, поддерживается ли репликация и как работают индексы.
Самый универсальный и мощный движок — MergeTree. Он предназначен для вставки больших объемов данных и последующей аналитики.
Важные моменты:
UInt64, DateTime, String, Float32. В ClickHouse строгая типизация. UInt означает Unsigned Integer (беззнаковое целое).event_time, а затем по id.> В отличие от классических БД, первичный ключ в ClickHouse не гарантирует уникальность. Он нужен для быстрого поиска и сжатия данных (разреженный индекс).
Вставка данных
ClickHouse оптимизирован для вставки данных большими пачками (батчами). Вставка по одной строке — это антипаттерн, который убьет производительность.
В реальных проектах данные вставляются пачками по 10 000 – 100 000 строк за раз.
Выборка данных (SELECT)
Запросы на чтение выглядят привычно:
Обратите внимание на функцию count(). В ClickHouse она работает быстрее, чем count(*), хотя делает то же самое.
Особенности работы с данными
Отсутствие UPDATE и DELETE (в привычном виде)
ClickHouse — это append-only система (ориентированная на добавление). Операции изменения (UPDATE) и удаления (DELETE) здесь называются Mutations (мутации). Они выполняются асинхронно и являются «тяжелыми» операциями, так как требуют перезаписи целых кусков данных (партов).
Пример мутации:
Этот запрос не удалит данные мгновенно. Он лишь запланирует удаление, которое произойдет в фоне.
Итоговая согласованность (Eventual Consistency)
Из-за особенностей архитектуры MergeTree, данные в ClickHouse не всегда доступны мгновенно после вставки для всех реплик, и процесс слияния (merge) кусков данных происходит в фоне. Это плата за высокую скорость записи и чтения.
Заключение
Мы рассмотрели базовую архитектуру ClickHouse. Теперь вы знаете, что:
В следующей статье мы углубимся в семейство движков MergeTree, разберем, как работает партиционирование и как правильно выбирать ключи сортировки для максимальной производительности.