Что такое партиционирование таблиц в БД и зачем оно нужно?

«Что такое партиционирование таблиц в БД и зачем оно нужно?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Партиционирование — это разделение одной большой логической таблицы на меньшие физические части (партиции) на основе определённого правила.

Основные цели:

  • Управление данными: Упрощение операций с большими объёмами данных (удаление старых данных через DROP PARTITION выполняется мгновенно, в отличие от DELETE).
  • Повышение производительности запросов: СУБД может использовать секционирование по условию (Partition Pruning), чтобы сканировать только релевантные партиции.
  • Повышение доступности: Операции с одной партицией меньше влияют на всю таблицу.

Основные типы партиционирования (на примере PostgreSQL):

  1. По диапазону (RANGE): Данные распределяются по диапазонам ключа (например, по дате).

    CREATE TABLE sensor_data (
        sensor_id int,
        recorded_at date,
        value numeric
    ) PARTITION BY RANGE (recorded_at);
    
    CREATE TABLE sensor_data_y2023m01 PARTITION OF sensor_data
        FOR VALUES FROM ('2023-01-01') TO ('2023-02-01');
  2. По списку (LIST): Партиция содержит строки с определёнными значениями ключа.

    CREATE TABLE sales (region text, amount int) PARTITION BY LIST (region);
    CREATE TABLE sales_europe PARTITION OF sales FOR VALUES IN ('DE', 'FR', 'UK');
  3. По хешу (HASH): Данные распределяются по партициям на основе хеш-функции от ключа, обеспечивая равномерное распределение.

    CREATE TABLE users (id int, name text) PARTITION BY HASH (id);
    CREATE TABLE users_p0 PARTITION OF users FOR VALUES WITH (MODULUS 4, REMAINDER 0);

Опыт применения:

  • Партиционирование таблиц с временными рядами (логи, события) по дате для эффективного удаления устаревших данных.
  • Настройка индексов на партициях (можно создавать отдельные индексы для каждой партиции).
  • Понимание ограничений: уникальные индексы/первичные ключи должны включать ключ партиционирования, JOIN между партиционированными таблицами может быть менее эффективным.