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