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

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 ] <Debug> default.stats (SelectExecutor): Key condition: (column 0 in [751, 751])

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

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