Вопрос 11 · Раздел 17

В чём разница между шардированием и партиционированием

Оба разделяют данные, но на разных уровнях:

Версии по языкам: English Russian Ukrainian

🟢 Junior Level

Оба разделяют данные, но на разных уровнях:

  • Партиционирование — разделение внутри одной БД на одном сервере
  • Шардирование — разделение между разными серверами
Партиционирование (одна БД):
Table → Partition 1 (2023)
      → Partition 2 (2024)
      → Partition 3 (2025)

Шардирование (много серверов):
DB → Shard 1 (Server 1)
   → Shard 2 (Server 2)
   → Shard 3 (Server 3)

🟡 Middle Level

Партиционирование

-- PostgreSQL range partitioning
-- PARTITION BY RANGE — PostgreSQL физически разделяет таблицу на части.
-- Каждая партиция хранит свои данные, но логически это одна таблица.
CREATE TABLE orders (
    id BIGINT,
    created_at DATE
) PARTITION BY RANGE (created_at);

CREATE TABLE orders_2024 PARTITION OF orders
    FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');

CREATE TABLE orders_2025 PARTITION OF orders
    FOR VALUES FROM ('2025-01-01') TO ('2026-01-01');

// Запрос WHERE created_at = ‘2023-06-15’ не попадает ни в одну партицию! // Нужна default partition или обработка ошибки.

Шардирование

MongoDB:
sh.shardCollection("db.orders", { user_id: "hashed" })

Cassandra:
Automatic sharding by partition key

Сравнение

Партиционирование Шардирование
Один сервер Много серверов
Одна БД Много БД
Проще Сложнее
Для оптимизации запросов Для масштабирования

🔴 Senior Level

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

Если таблица помещается в память и запросы быстры — ни партиционирование, ни шардирование не нужны.

Партиционирование:

✅ Большая таблица, один сервер
✅ Оптимизация запросов по дате
✅ Архивирование старых данных

Шардирование:

✅ Один сервер не справляется
✅ Нужно горизонтальное масштабирование
✅ Данные не помещаются на один сервер

Best Practices

✅ Партиционирование для оптимизации
✅ Шардирование для масштабирования
✅ Начинайте с партиционирования
✅ Шардируйте когда упрётесь в лимиты

❌ Шардирование без необходимости
❌ Сложные cross-shard запросы

🎯 Шпаргалка для интервью

Обязательно знать:

  • Партиционирование — разделение внутри ОДНОЙ БД на одном сервере
  • Шардирование — разделение между РАЗНЫМИ серверами
  • Партиционирование для оптимизации запросов, шардирование для масштабирования
  • Начинайте с партиционирования — проще, меньше overhead
  • PostgreSQL поддерживает PARTITION BY RANGE/LIST/HASH
  • MongoDB/Cassandra поддерживают автоматическое шардирование
  • Если таблица помещается в RAM и запросы быстры — ни то ни другое не нужно

Частые уточняющие вопросы:

  • Когда партиционирование? Большая таблица, один сервер, оптимизация по дате, архивирование.
  • Когда шардирование? Один сервер не справляется, данные не помещаются, нужно горизонтальное масштабирование.
  • Можно ли комбинировать? Да — партиционирование внутри шарда.
  • PostgreSQL партиционирование как работает? PARTITION BY RANGE/LIST — физическое разделение, логически одна таблица.

Красные флаги (НЕ говорить):

  • “Партиционирование и шардирование — одно и то же” — нет, разные уровни
  • “Шардирование всегда лучше” — нет, сложнее и дороже
  • “Партиционирование решает проблему масштабирования” — нет, только одного сервера
  • “Нужно шардировать сразу” — нет, начинайте когда упрётесь в лимиты

Связанные темы:

  • [[10. Что такое шардирование sharding]]
  • [[12. Как реализовать горизонтальное масштабирование микросервисов]]
  • [[13. Что такое паттерн Database per Service]]
  • [[14. Какие проблемы возникают при использовании общей базы данных]]
  • [[26. Какие инструменты используются для оркестрации микросервисов]]