Сортировка (aka primary key).
Одна из важнейших идей, как ускорить ваши дэшики.
Я всем объясняю сортировку на примере библиотеки.
Если ты придёшь в библиотеку и попросишь Шолохова и Булгакова, то библиотекарь пойдет до индекса букв Б и Ш соответственно и внутри быстренько найдет нужного тебе автора. Библиотекарь не будет перебирать все книги, это же очевидно.
То же самое надо сделать и в КХ для быстрого отклика дэша под конкретную историю.
Например, хотим быстро искать товары по брендам, мы создаем таблицу goods и указываем ORDER BY brand_name при создании
CREATE TABLE default.goods (
)
ENGINE = ReplicatedMergeTree('/data2viz/{shard}', '{replica}')
ORDER BY brand_name
Тогда при записи в таблицу данных КХ будет сортировать вставляемые записи по brand_name и записывать в блоки (гранулы):
- вот тут лежат значения от Bosch до Bose
- а вот тут от Apple до Ariston
по сути, вешая ярлычки на блоки данных.
И когда придет запрос с WHERE brand_name = 'LEGO' из всех блоков выберутся только те, которые подходят под условие попадания ярлычка от и до. То есть вместо FULL SCAN будет выбрано 1/100 или даже 1/1000 строк, неплохо?
Самая важная вещь - понять, как отсортировать табличку для вашего бизнеса и дэша.
Как выбирать поле сортировки с точки зрения техники?
1) Которое убирает наибольшее количество строк на примерно равнозначные множества
2) Которое будет сонаправлено другим полям, чтобы лучше сжать другие колонки на диске (влияет на I/O)
Как сортировать с точки зрения бизнеса?
1) Как у вас поделена ответственность в бизнесе за цифры между людьми / Категориями товаров?
2) Как у вас смотрят и принимают решения по конкретному региону, группе товаров?
3) Сколько людей смотрят дэш и по каким пользовательским историям?
Сортировка после запуска дэша
1) Выберите логи по людям, дэшам, чартам
2) распарсите логи и отберите самые частые в WHERE поля и что в них пробуют фильтровать и кто
3) соберите новую логику сортировки полей
Общее: Волшебной пилюли нет, надо думать и тестировать разные варианты =)
Прочти основной лонгрид от КХ после прочтения моей заметки =)
