Этот вопрос проверяет понимание архитектурных подходов к масштабированию баз данных и различий между вертикальной и горизонтальной организацией данных.
Партиционирование — это разбиение одной таблицы внутри одной базы данных на логические части (партиции), чтобы ускорить запросы и упростить управление данными.
Шардирование — это распределение данных между разными базами или серверами, что увеличивает горизонтальное масштабирование и пропускную способность системы.
Партиционирование применяется для оптимизации больших таблиц, а шардирование — когда одной базе физически не хватает ресурсов и данные нужно распределять по нескольким узлам.
Чтобы масштабировать большие объёмы данных и повышать производительность, используют два разных подхода: партиционирование и шардирование. Часто их путают, хотя это архитектурно разные концепции.
Определение:
Партиционирование — это разделение одной таблицы на логические части (партиции), которые хранятся внутри одной и той же базы данных, на том же сервере.
По диапазону (range)
Разделение по дате, числовому диапазону:
данные за 2023 → партиция 2023
данные за 2024 → партиция 2024
По списку (list)
Разделение по категории:
Россия → partition_ru
Европа → partition_eu
По хэш-функции (hash)
Равномерное распределение ключей по партициям.
Запросы читают только нужные партиции (partition pruning).
легче удалять старые данные (detach partition → drop)
легче бэкапить частями
Каждая партиция имеет свой индекс → индексы меньше → быстрее.
sql
CREATE TABLE events (
id INT,
created_at DATE
) PARTITION BY RANGE (created_at);
CREATE TABLE events_2024 PARTITION OF events
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
Определение:
Шардирование — это разбиение данных между разными физическими серверами, каждый из которых содержит только часть данных.
Шард = отдельная база данных + отдельный сервер или кластер.
Hash-based shardingshard_id = hash(user_id) % N
Range-based sharding
Например:
user_id 1–1M → shard 1
user_id 1M–2M → shard 2
Geo-sharding
Данные разных регионов хранятся на разных физических кластерах.
При росте нагрузки можно добавлять новые сервера.
Каждый сервер обслуживает часть запросов.
Меньше данных → быстрее индексы → быстрее запросы.
таблица превышает миллионы/миллиарды строк
операции удаления старых данных должны выполняться быстро
запросы читают данные только частично (например, по дате)
одна база данных физически не справляется с нагрузкой
требуется горизонтальное масштабирование
высокая частота записи
нагрузка распределена по ключам (user_id, tenant_id)
Партиционирование улучшает производительность одной БД, разбивая таблицу на части.
Шардирование масштабирует систему, распределяя данные между несколькими БД на разных серверах.
Выбор зависит от того, что упирается в предел — одна таблица или весь сервер.