← Назад к вопросам

Какие проблемы решает колоночная БД?

3.0 Senior🔥 141 комментариев
#Архитектура и паттерны#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проблемы, решаемые колоночными БД

Колоночные БД (ClickHouse, Apache Parquet, Cassandra) хранят данные по колонкам вместо строк. Это решает проблемы аналитики и больших данных.

Традиционные (строковые) БД

Таблица users (строковая):

В памяти: строка по строке

Проблемы строковых БД

Проблема 1: Чтение лишних данных

Запрос: какой средний возраст? SELECT AVG(age) FROM users;

Строковая БД читает ВСЕ поля:

id(4B) + name(50B) + age(4B) + city(50B) + email(100B) = 208B на строку

Для 1 млн записей: 208 МБ

Нам нужна только колонка age (4 МБ), но прочитана 208 МБ.

Проблема 2: Плохая компрессия

В одной строке значения разных типов (число, текст, текст). Сложно компрессировать.

Проблема 3: Медленные аналитические запросы

Запрос: сумму продаж по городам SELECT city, SUM(amount) FROM orders GROUP BY city;

Строковая БД:

  1. Читает целую таблицу (город, сумма, дата, юзер, и т.д.)
  2. Фильтрует по городу
  3. Аггрегирует Очень медленно на больших данных (млн записей).

Колоночные БД

Колонка id: [1, 2, 3, ...] Колонка name: [John, Jane, Bob, ...] Колонка age: [25, 30, 35, ...] Колонка city: [New York, LA, Boston, ...] Колонка email: [...]

Решения колоночных БД

1. Читаются только нужные колонки

Запрос: средний возраст SELECT AVG(age) FROM users;

Колоночная БД: читает ТОЛЬКО колонку age age: [25, 30, 35, ...] = 4 МБ (вместо 208 МБ) Экономия: 52x!

2. Отличная компрессия

В одной колонке значения одного типа → компрессируются в 10-100 раз:

age: [25, 30, 35, 40, 25, 30, ...] Много повторений одного типа данных → хорошо компрессируется

Схема: 1 млн чисел × 4 байта = 4 МБ Если повторяется (25 встречается 50%, 30 встречается 30%): Компрессия: может быть 100-500 КБ

Экономия: 4 МБ → 100 КБ (40x сжатие!)

Практический пример с ClickHouse:

  • Размер: 1 млрд записей
  • Строковая БД: ~200 ГБ на диске
  • ClickHouse: ~10 ГБ на диске (20x меньше!)

3. Быстрые аналитические запросы

Запрос на 1 млрд записей SELECT city, SUM(amount) FROM sales GROUP BY city;

  • Строковая БД: 30-60 секунд
  • ClickHouse: 0.1-0.5 секунды (100-600x быстрее!)

Почему? ClickHouse:

  1. Читает только city и amount колонки
  2. Они уже скомпрессированы
  3. Использует SIMD инструкции (несколько значений за раз)
  4. Параллелизирует обработку

4. Векторизованная обработка

Обработка множества значений за раз (SIMD):

Строковая БД: обработка по одной строке Колоночная БД: обработка целого массива [25, 30, 35, 40] за одну операцию

5. Параллельная обработка

Необходимо только несколько колонок → легко распределить.

Сравнение

СценарийСтроковая БДКолоночная БД
SELECT * WHERE id=51 мс10 мс
SELECT id WHERE age>251 сек10 мс
SUM(amount) GROUP BY city30 сек0.1 сек
UPDATE row 51 мс100 мс
Размер на диске200 ГБ10 ГБ
Компрессия2x20x

Когда использовать

Используй колоночные БД когда:

  • Аналитические запросы (GROUP BY, SUM, AVG)
  • Большие объёмы данных (> 100 млн записей)
  • Нужна скорость (< 1 сек на аналитику)
  • Логирование и мониторинг (временные ряды)
  • Write-once сценарии (вставляешь, потом только читаешь)

Не используй когда:

  • OLTP (транзакции) — обновления einzelne строк
  • Запросы с WHERE по индексам
  • Небольшие данные (< 1 млн записей)
  • Нужны частые обновления
  • Джойны

Популярные колоночные БД

  • ClickHouse: самая популярная, отличная для аналитики и логов
  • Apache Parquet: format для хранения (не БД)
  • Cassandra: распределённая колоночная БД

Заключение

Колоночные БД решают проблему медленной аналитики на больших данных. Читают только нужные колонки, отлично компрессируются, обрабатывают векторизованно. Идеальны для анализа логов, метрик, временных рядов. Но плохи для транзакций и частых обновлений — для этого остаётся SQL (PostgreSQL, MySQL).