https://ru.wikipedia.org/wiki/LSM-деревоhttps://ru.wikipedia.org/wiki/B-деревону и погуглить
если кратко и на пальцах
то у clickhouse один PRIMARY INDEX
потому что когда clickhouse делает вставку он создает НОВЫЙ part
новый каталог прямо на диске
где все колонки это набор из .mrk (индекс) + .bin файла (сжатые сырые данные)
и есть primary.idx
очень грубо это key-value => значения полей primary index value == смещение внутри .bin файла колонок, где лежат данные для этого primary key
ну и поверх всего этого еще есть PARTITION (не путайте с parts)
дальше в фоне идет сортировка слиянием
https://ru.wikipedia.org/wiki/Сортировка_слиянием), чтобы селекты со временем не превращались в бесконечный "grep" ;)
при чтении за счет эффективного хранения
1) идет выбор партиции (нескольких)
2) потом эта партиция (несколько в паралели) сканируется (читается и фильтруется через SSE) по колонкам тупо с диска (есть кеш uncompressed данных и кеш mrk файлов, но для понимания это не важно)
либо по primary index (поэтому туда помещаются низко кардинальные поля которые часто встречаются в запросах) либо по secondary key
либо как есть, разжимаем блок, прогоняем через CPU лишнее отфильтровываем