Рубріки: HighloadТеория

Использование индексов в Clickhouse

Игорь Грегорченко

Clickhouse — это колоночная база данных от Яндекс. База специально разработана для аналитических задач на больших объемах.

База данных поддерживает индексы, но в отличие от классических СУБД, в ней есть ряд ограничений. Среди нескольких движков таблиц, наиболее продвинутый MergeTree поддерживает индексы.

Первичный ключ

Для каждой таблицы можно использовать только один индекс (первичный ключ). Основная задача индекса — иметь возможность отфильтровать большую таблицу с данными. Например, большую таблицу просмотров товаров по конкретному товару:

* date 
* product_id 
* product_category 
* product_name

Объявление индексов

Чтобы указать индекс, нужно просто перечислить колонки при создании таблицы:

CREATE TABLE products_views (
     date Date,
     product_id UInt32,
     product_name String,
     product_category UInt8
) ENGINE = MergeTree(date, (product_id), 8192)

Создание таблицы с индексом

Конструкция MergeTree объявляет индекс:

  • date — название колонки, в которой находится дата. В clickhouse это обязательно, т.к. все данные всегда распределены по значениям этой колонки.
  • product_id — название колонки, по которой строится индекс.
  • 8192 — гранулированность индекса (используйте значение из примера).

SELECT count(*) FROM products_views WHERE product_id = 751

С такой структурой индекса, запросы будут эффективными:

#в таком запросе будет использован индекс

Индекс может состоять из нескольких колонок (составной индекс):

CREATE TABLE products_views (
     date Date,
     product_id UInt32,
     product_name String,
     product_category UInt8
) ENGINE = MergeTree(date, (product_id, url), 8192)

Составной индекс

Однако в этом случае, в выборке могут использоваться колонки слева-направо (фильтр по одной только колонке url не использует индекс). Как и в других базах данных индекс будет использован в случае не только равенства, а и неравенства и операции IN.

Проверка индекса

На текущий момент Clickhouse не поддерживает запрос EXPLAIN. Однако в логе запросов можно убедиться, что индекс будет использован:

tail -f /var/log/clickhouse-server/clickhouse-server.log

Если индекс используется мы увидим такие строки в файле:

[ 20 ] default.stats (SelectExecutor): Key condition: (column 0 in [751, 751])

В противном случае, если базе не удалось использовать индекс, мы увидим вот что:

[ 20 ] default.stats (SelectExecutor): Key condition: unknown

TL;DR

Clickhouse поддерживает только один индекс на таблицу. Индекс может состоять из нескольких колонок (составной индекс). При использовании этих колонок в запросе WHERE база оптимизирует выборку с помощью индекса.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023