ClickHouse: строковая оптимизация с LowCardinality

ivannatarov 37 минут назад ClickHouse: строковая оптимизация с LowCardinality Простой 3 мин 949 Базы данных * Data Engineering * FAQ Привет, Хабр!В прошлых статьях мы разбирали основной движок ClickHouse - MergeTree,...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: ivannatarov 37 минут назад ClickHouse: строковая оптимизация с LowCardinality Простой 3 мин 949 Базы данных * Data Engineering * FAQ Привет, Хабр! В прошлых статьях мы разбирали основной движок ClickHouse - MergeTree, материализованые представления и словари. В этой статье разберем инструмент оптимизации — LowCardinality.
Это не просто тип данных, а способ эффективной работы со строками. LowCardinalityПрежде чем мы погрузимся в детали LowCardinality, давайте дадим определение понятию «кардинальность». Кардинальность — это количество уникальных значений в столбце.
Технические детали
Низкая кардинальность означает, что столбец содержит небольшое количество уникальных значений при большом общем количестве строк, а высокая, наоборот - это когда уникальных значений много или почти все значения уникальны. Теперь поговорим о LowCardinality и о том, как это связано с кардинальностью. LowCardinality(T) — это специальная «обёртка» над другим типом данных T (как правило, это String или FixedString), которая заставляет ClickHouse использовать словарное кодирование для колонки.
Это значит, что ClickHouse создаст словарь уникальных значений и в основной таблице будет хранить лишь компактные числовые ссылки на него. Этот тип данных особенно эффективен для колонок, где количество уникальных значений значительно меньше общего числа строк. Такие колонки называют колонками с низкой кардинальностью.
Представим, что у нас есть огромная таблица с миллионами записей о визитах на сайт. В этой таблице есть колонка browser, где хранится название браузера пользователя: «Chrome», «Яндекс. Уникальных названий браузеров всего три, но сами строки повторяются миллионы раз.
Отраслевые последствия
Для простоты восприятия изобразим это следующим образом:Постоянное дублирование строк неэффективно как для хранения, так и для скорости выполнения запросов. Гораздо эффективнее было бы присвоить каждому уникальному браузеру короткий числовой код (например, «Яндекс. Браузер» → 1, «Safari» → 2, «Chrome» → 3) и хранить в таблице именно эти числа.
Здесь мы и можем использовать оптимизацию с помощью типа данных LowCardinality. Изменим тип данных в нашей первоначальной колонке со String на LowCardinality(String):ClickHouse «под капотом» сделал следующее (в упрощённом виде):Создал словарь, где сохранил только уникальные значения браузеров, присвоив каждому уникальный числовой ключ. В самой таблице вместо полного текстового значения для каждой строки сохранил лишь небольшой целочисленный индекс, указывающий на соответствующее значение в словаре.
Теперь давайте выполним следующий запрос:SELECT browser FROM table WHERE browser = 'Chrome'Схематично выполнение запроса можно представить следующим образом:ClickHouse видит в запросе значение «Chrome» и один раз смотрит в словарь, чтобы найти его числовой ключ, в данном случае — 3.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.






