Архитектура
Внутреннее устройство
В этой главе мы рассмотрим несколько архитектурных решений, которые позволяют ClickHouse эффективно работать с большим количеством данных.
Как хранятся таблицы
Данные хранятся на диске в колоночном формате. Это значит, что значения каждого столбца хранятся отдельно. Например, если у вас есть таблица с миллиардами строк, ClickHouse не хранит каждую строку целиком, а группирует значения по столбцам.
Это позволяет эффективно сжимать данные (так как значения в одном столбце часто повторяются) и быстро читать только нужные столбцы для запроса.
И да, все данные хранятся в сжатом виде.
Например у нас есть такая таблица (как посмотреть DDL таблицы):
CREATE TABLE ANALYTICS.TEST_TABLE ( `LOAD_DATE` Nullable(String), `DOCUMENT_ID` Nullable(String), `CREATE_DATETIME` Nullable(String), `CREATE_DATE` DateTime ) ENGINE = MergeTree ORDER BY CREATE_DATE;
И если мы выполним запрос:
SELECT COUNT(*) FROM ANALYTICS.TEST_TABLE WHERE CREATE_DATETIME > '2024-01-01';
ClickHouse прочитает только столбец, а не всю таблицу, что значительно ускоряет выполнение запроса.
Партиционирование и ключ сортировки
Партиционирование — это разделение данных на части (партиции) по какому-либо критерию. Это помогает ClickHouse быстрее находить нужные данные и уменьшает объём данных, которые нужно обрабатывать.
На диске партиции хранятся отдельными файлами, что существенно экономит ресурсы при доступе к большим таблицам (не надо читать большой файл, а нужно прочитать только нужные)
Посмотрим на такую таблицу:
CREATE TABLE ANALYTICS.TEST_TABLE
(
`LOAD_DATE` Nullable(String),
`DOCUMENT_ID` Nullable(String),
`CREATE_DATETIME` Nullable(String),
`CREATE_DATE` DateTime
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(CREATE_DATE)
ORDER BY CREATE_DATE;
Если мы выполним запрос:
SELECT LOAD_DATE, DOCUMENT_ID
FROM ANALYTICS.TEST_TABLE
WHERE CREATE_DATE > '2024-01-01';
То CH прочтет с диска только необходимые партиции, т.е. начиная с января 2024, а на прочтение остальных он даже не будет тратить ресурсы.
Ключ сортировки — это секция ORDER BY — определяет, как данные будут физически упорядочены на диске.
Внутри каждой партиции или целиком в таблице, если она не партиционирована, данные будут упорядочены по ключу сортировки
Этот порядок используется ClickHouse для оптимизации запросов — особенно связанных с сортировкой и фильтрацией
Параллельные вычисления
ClickHouse обрабатывает данные параллельно, используя все доступные ресурсы CPU (центрального процессора). Это одна из причин, почему он такой быстрый.
ClickHouse разбивает данные на части, обрабатывает каждую часть параллельно (на нескольких ядрах), а затем объединяет результаты.
Это особенно полезно для агрегаций GROUP BY и фильтраций WHERE.
Last updated