Skip to main content

Устройство любого не 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), чтобы улучшить сжатие и ускорить диапазонные запросы.