https://clickhouse.tech/docs/en/operations/table_engines/mergetree/#primary -ключи-и-индексы в запросах
Первичный ключ разбирается. По умолчанию он содержит 1 значение из каждой 8192 строк (= 1 гранулы).
Давайте отключим адаптивную гранулярность (для теста) - index_granularity_bytes = 0
create table X (A Int64)
Engine=MergeTree order by A
settings index_granularity=16,index_granularity_bytes=0;
insert into X select * from numbers(32);
index_granularity = 16 - 32 строки = 2 гранулы, первичный индекс имеет 2 значения 0 и 16
select marks, primary_key_bytes_in_memory from system.parts where table = 'X';
┌─marks─┬─primary_key_bytes_in_memory─┐
│ 2 │ 16 │
└───────┴─────────────────────────────┘
16 байт === 2 значения INT64.
Адаптивный индекс гранулярности означает, что размер гранул различен. Поскольку широким строкам (много байтов) требуется (для производительности) меньше (<8192) строк в грануле. </p>
index_granularity_bytes = 10 МБ ~ 1k строк * 8129. Таким образом, каждая гранула имеет 10 МБ. Если размер строки 100k (long Strings), гранула будет иметь 100 строк (не 8192).
Пропуск гранул индекса GRANULARITY 3 - означает, что индекс будет хранить одно значение для каждых 3 гранул таблицы.
create table X (A Int64, B Int64, INDEX IX1 (B) TYPE minmax GRANULARITY 4)
Engine=MergeTree order by A
settings index_granularity=16,index_granularity_bytes=0;
insert into X select number, number from numbers(128);
128/16 = 8, в таблице 8 гранул, INDEX IX1 хранит 2 значения minmax (8/4)
Таким образом, индекс minmax хранит 2 значения - (0..63 ) и (64..128)
0..63 - указывает на гранулы первых 4 столов.
64..128 - указывает на гранулы вторых 4 столов.
set send_logs_level='debug'
select * from X where B=77
[ 84 ] <Debug> dw.X (SelectExecutor): **Index `IX1` has dropped 1 granules**
[ 84 ] <Debug> dw.X (SelectExecutor): Selected 1 parts by date, 1 parts by key, **4 marks** to read from 1 ranges
Проверка пропущенного индекса SelectExecutor - 4 таблицы гранул могут быть пропущены, поскольку 77 отсутствует в 0..63 И еще 4 гранулы должны быть прочитаны ( 4 отметки ), потому что 77 в (64..128) - некоторые из этих 4 гранул имеют B = 77.