Колоночные базы данных

Базовый System Design
≈ 2 мин чтения

Столбцы можно хранить вместе

В обычной row-oriented базе значения одной строки физически удобно читать вместе. Column-oriented database организует хранение так, чтобы значения одного столбца находились рядом. Это особенно полезно для аналитических запросов, которые читают миллионы строк, но используют лишь несколько полей.

row storage:    [id, time, country, amount] [id, time, country, amount]
column storage: [id, id, ...] [time, time, ...] [country, country, ...]

Аналитике редко нужна вся строка

Представим таблицу событий с десятками полей. Запрос «сумма продаж по странам за месяц» может использовать только country, amount и время. Колоночное хранение позволяет не читать остальные поля для каждой записи.

Одинаковые типы значений рядом также хорошо сжимаются, что уменьшает объём чтения с диска и сети.

OLAP и OLTP имеют разные приоритеты

Онлайн-транзакционная нагрузка обычно выполняет множество небольших операций над конкретными записями. Аналитическая нагрузка, наоборот, часто сканирует большие диапазоны и агрегирует огромные наборы данных.

Колоночные системы хорошо подходят второй модели. Это не означает, что любая колоночная база должна становиться основной базой пользовательских транзакций.

Данные часто загружаются пакетами

Для аналитического хранилища естественен поток, где события сначала возникают в операционных системах, а затем попадают в аналитическое хранилище для отчётов, агрегаций и исследований.

operational systems -> data pipeline -> column store -> analytics
Название «колоночная база» описывает способ хранения и оптимизации, а не магическое ускорение любого запроса. Польза появляется, когда нагрузка действительно состоит из больших сканов и агрегаций по ограниченному набору колонок.