Что такое ClickHouse и зачем он нужен?
Колонночная СУБД для аналитики (OLAP). Очень быстро работает с миллиардами строк.
Чем ClickHouse отличается от PostgreSQL?
✔ ClickHouse — OLAP, PostgreSQL — OLTP.
ClickHouse хранит данные по колонкам, не поддерживает полноценные транзакции
Типы данных, которые есть в clickhouse, но нет в postgres:
1) Array - полноценные массивы, могут быть вложенными, не требуют фиксированной длины, хранятся в колоночном формате.
2) Tuple - аналог кортежей
3) Nested - вложенные таблицы внутри столбца
4) LowCardinality(String) - оптимизирован для колонок с повторяющимися значениями.
Шардирование и партицирование
Шардирование - разбиение данных на шарды, где каждый сервер будет работать со своей группой шардов.
Партицирование - это логическое разбиение данных на одном сервере, для ускорения работы. (Мы выбираем партиции с необходимыми данными, а не все данные)
Архитектура ClickHouse
Оптимизации для специфических задач
MergeTree, ReplacingMergeTree, AggregatingMergeTree)Типы таблиц в CH
1) MergeTree - базовый тип таблиц (все остальные это расширения). Если не знаешь, что выбрать - бери ее.
2) ReplacingMergeTree - таблица, которая позволяет заменять старые записи на новые на этапе мерджа.
3) SummingMergeTree - автоматически агрегирует поля по одинаковым ключам.
4) AgregationMergeTree - используется, когда данные хранятся в виде агрегатных статистик (data-мартс)
5) CollapsingMergeTree, VersionCollapsingMergetTree - используются редко, позволяет реализовывать медленные изменения.
Skip indexes
Пропускающие индексы. Это механизм в CH, который позволяет быстро находить необходимые данные за счет гранул и метаданных для них.
Гранулы
Гранула - это определенный объем данных для оптимазиции OLAP задач. Данные в ch хранятся в колонках и разбиваются на гранулы (примерно по 8200 строк). Каждая гранула имеет свои метаданые (максимальное значения, минимальное, есть ли null и т.д.)
Данный механизм позволяет пропускать большие объемы ненужных данных.
Типы skip indexes
1) minmax - хранит минимальное и максимальное значения в грануле
2) set - хранит множество уникальных значений в грануле
3) bloom_filter - позволяет ускорить поиск подстроки
4) tokenbf_v1, ngrambf_v1
Индексы и их работа в clickhouse
Ключевое отличие индексов в ch: индексы в ch помогают не находить точное значение, а помогают пропускать блоки данных.
1) Primary key - используется для ускорения поиска по диапазону
2) Skip indexes (minmax, set, bloom_filter)
Преимущества колоночных баз данных
1) Быстрые агрегатные запросы
2) Меньше IO при чтении нужных колонок
3) Эффективное сжатие
Виды JOIN в CH и как улучшить производительность
Виды:
1) ANY - самый быстрый вид. Берет строку из левой и первую попавшуюся из правой, если их несколько.
2) ALL - берет все строки из правой.
3) SEMI - возвращает строки только из левой, если есть совпадение в правой.
4) ANTI - противоположность SEMI. Возвращает строки из левой, у которых нет совпадений.
Улучшение производительности:
1) Для лучшей производительности правая таблица должна быть маленькая.
2) JOIN работает быстрее при использовании словарей.
Что такое MergeTree
Это основной движок, на котором строится работа CH.
В чем основная идея:
1) Таблица разбивается на партиции (по логике)
2) Сами партиции разбиваются на части (parts), которые отсортированы по первичному ключу.
3) Если parts становится слишком много, они сливаются, а старые версии удаляются.
4) Parts разбиты на гранулы (минимальный блок данных, с которым работает primary key). Гранул - это набор строк (обычно около 8200) и метаданные к этим строкам (set, bloom_filter).
Отличие столбцовых и строковых бд
1) Строковые направлены на OLTP и хороши для транзакций (Mysql, postgres)
2) Столбцовые направлены на OLAP-системы, хороши для аналитики и больших объемов данных.
Преимущества столбцового хранения: лучшее сжатие, быстрые выборки
Минусы: плохо работает с транзакциями и неэффективно при частом изменении данных
Типы данных в CH
1) Числовые (Int, UInt, Float, Decimal)
2) Строки (String, FixedString)
3) Даты и время (Date, DateTime)
4) Массивы и сложные типы (array, map, tuple, nested, LowCordinality)
5) Специальные (enum, nullable)
Создание таблиц в ClickHouse
create table t1 ( id UInt32, event_time DateTime ) engine=MergeTree partition by toYYYYMM(event_time) order by (event_time)
Принципы построения схем данных в CH
1) Колончатая модель
2) Минимизировать join
3) Использовать денормализацию
4) Primary key
5) Партицирование
6) Сжимать данные
Как денормализовать данные в CH
Первичные ключи в CH и
как лучше использовать
В CH первичный ключ - это ключ сортировки, а не constraint, поэтому он не гарантирует уникальность записи.
* Определяет структуру хранения данных
* Влияет на производительность чтения и мерджей
* Обычно используется на даты и время
* Должен включать поля по которым часто происходит фильтрация
TTL
Time To Live - механизм, который позволяет удалять или перемещать старые данные (настраивается при создании таблы)
Уникальные функции CH
uniq() — приближённый подсчёт уникальныхuniqExact() — точный подсчёт уникальныхsumIf(value, condition)avgIf(value, condition)groupArray(n)(col) — собрать массив из первых n значенийtopK(n)(col) — топ наиболее частых значенийПочему при подключении через Engine=PostgreSQL не работает через schem_name.table_name
Потому что click берет таблицы из схемы public, а вообще там отдельно можно указать схему и все будет работать
Что такое LowCardinality?
«LowCardinality — это словарное кодирование столбцов с малым числом уникальных значений, которое снижает объём данных и ускоряет аналитические запросы в ClickHouse.»