# Устройство любого не b-tree индекса РСУБД (полнотекстовый, пространственный, колончатый, и др.).

Колончатые индексы устроены принципиально иначе, чем традиционные строковые индексы (например, B-Tree), и оптимизированы для аналитических запросов, где часто затрагивается лишь небольшое подмножество столбцов таблицы, но при этом обрабатывается большое количество строк.

Ключевой момент: в отличие от обычного индекса, это фактически колоночная организация таблицы, а не отдельная структура поверх таблицы.

> Вместо того чтобы хранить строки таблицы подряд, данные разбиваются по столбцам.

```
Таблица:
id | name  | age
1  | Alice | 30
2  | Bob   | 25
3  | Carl  | 35

Колоночное хранение:
id:   [1, 2, 3]
name: ["Alice", "Bob", "Carl"]
age:  [30, 25, 35]
```

- Это позволяет эффективно читать только нужные столбцы при выполнении запроса, экономя I/O.
- Колоночные индексы/структуры особенно эффективны для:
GROUP BY, COUNT, SUM, WHERE по отдельным столбцам.
- Медленнее работают при запросах, где нужно получить или обновить целые строки, так как строка распределена по разным местам на диске.

⸻

#### Блокировка (Chunking) и сегментация
- Данные в каждом столбце разбиваются на блоки или сегменты (chunks/segments/partitions).
- Обычно в одном блоке находится определенное количество строк (например, 1000 строк).
- Такой блок — минимальная единица чтения, сжатия и индексирования.

⸻

#### Сжатие
- Блоки данных сжимаются по отдельности.
- Поскольку в одном столбце значения однородны, применяются эффективные алгоритмы:
  - **Dictionary encoding** — если значений мало (например, пол: M/F), они заменяются на индексы.
  - **Run-Length Encoding (RLE)** — если значение повторяется подряд, оно заменяется на (значение, количество).
  - **Delta encoding** — для чисел или дат, где хранится разница между соседними значениями.

⸻

#### Порядок строк
- В отличие от строковых индексов, порядок строк в колоночной системе может быть изменён для оптимизации.
- Строки часто сортируются по какому-то столбцу (например, дате или ID), чтобы улучшить сжатие и ускорить диапазонные запросы.