Архитектура

Внутреннее устройство

В этой главе мы рассмотрим несколько архитектурных решений, которые позволяют 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