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

«В чем разница между партиционированием и шардированием?» — вопрос из категории SQL и базы данных, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обе техники разделяют данные, но на разных уровнях и с разными целями.

Аспект Партиционирование (Partitioning) Шардирование (Sharding)
Уровень Логическое разделение внутри одной базы данных/таблицы. Физическое разделение между разными серверами/нодами.
Цель Упрощение управления большими таблицами (очистка старых данных, быстрые запросы по диапазону). Горизонтальное масштабирование для распределения нагрузки и увеличения пропускной способности.
Прозрачность Обычно прозрачно для приложения (запросы к одной логической таблице). Часто требует от приложения или шард-ключа понимания, на каком шарде искать данные.
Пример правила По диапазону дат (PARTITION BY RANGE), по списку значений (PARTITION BY LIST). По хэшу от ключа, по диапазону ключей (например, user_id).

Пример партиционирования в PostgreSQL (разделение по месяцам):

CREATE TABLE sales (
    id SERIAL,
    sale_date DATE NOT NULL,
    amount DECIMAL
) PARTITION BY RANGE (sale_date);

CREATE TABLE sales_2024_01 PARTITION OF sales
    FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');
CREATE TABLE sales_2024_02 PARTITION OF sales
    FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');
-- Запрос с WHERE sale_date >= '2024-02-15' будет сканировать только partition sales_2024_02.

Пример шардирования (концептуальный):

  • Шард A (Сервер 1): Пользователи с user_id от 1 до 1.000.000.
  • Шард B (Сервер 2): Пользователи с user_id от 1.000.001 до 2.000.000.

Ключевое отличие: Партиции помогают управлять данными на одном сервере, шарды — масштабировать систему на несколько серверов.