Привет! Во-первых, спасибо разработчикам ClickHouse, действительно клевая база данных. Есть несколько вопросов.
Дано:
* Одна нода - сервер на DO 16 CPU, 32 GB RAM, attached volume на 3 ТБ
* Таблица 5 млрд записей
CREATE TABLE impression.impression (
`date` Date,
`timestamp` DateTime,
`unique_id` UUID,
`client` String,
`campaign` String,
`publisher` String,
`application` String,
`click_id` String,
`os_name` String,
`os_version` String,
`pclick` String,
`idfa` String,
`gaid` String,
`ip_address` String,
`country_code` FixedString(2),
`city` String,
`isp` String,
`latitude` Float64,
`longitude` Float64,
`referrer` String,
`user_agent` String
) ENGINE = MergeTree(date, unique_id, 8192)
* Запись в таблицу производится с нескольких серверов батчами по 10к записей
1. Первоначально требовалось быстро искать по полю un
ique_id.
Поэтому именно это поле я и выбрал как первичный ключ. Позже появилось требование искать еще по полю cl
ick_id.
Пытался разметить таблицу следующим образом: EN
GINE MergeTree() PARTITION BY date ORDER BY (date, unique_id, click_id) SETTINGS index_granularity=8192.
Но это не помогло. Подскажите, какой первичный ключ (ключ сортировки) надо было выбрать? Или CH для этого класса задач не подходит? Вообще стоило ли добавлять da
te в
начало ключа сортировки?
2. Второй класс задач - группировки (GROUP BY) по различным полям (дата, client, campaign, publisher, ...) с фильтрацией (WHERE по выбранным client, campaign, publisher) за определенный период времени. Что наилучшим образом повлияет на ускорение запросов? MatView, репликация, шардирование, иной Primary Key?
3. Планирую переход с одной ноды на кластер. Сейчас в таблицу записывается 200 млн/сутки, в перспективе будет 1 млрд/сутки. Порекомендуйте, пожалуйста, конфигурацию кластера и характеристики серверов.