Что такое партиционирование таблиц в базах данных?

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

Ответ

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

Основные типы партиционирования в MySQL/PostgreSQL:

  1. По диапазону (RANGE): Для упорядоченных данных (даты, ID).
  2. По списку (LIST): Для группировки по категориям (регион, статус).
  3. По хешу (HASH): Для равномерного распределения.

Пример: Партиционирование таблицы логов по месяцу (MySQL RANGE):

CREATE TABLE application_logs (
    id BIGINT NOT NULL AUTO_INCREMENT,
    log_level VARCHAR(10),
    message TEXT,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id, created_at) -- Ключ партиционирования ДОЛЖЕН входить в PRIMARY KEY
) ENGINE=InnoDB
PARTITION BY RANGE COLUMNS(created_at) (
    PARTITION p_2023_10 VALUES LESS THAN ('2023-11-01'),
    PARTITION p_2023_11 VALUES LESS THAN ('2023-12-01'),
    PARTITION p_2023_12 VALUES LESS THAN ('2024-01-01'),
    PARTITION p_future VALUES LESS THAN MAXVALUE
);

Преимущества:

  • Повышение производительности запросов: При условии WHERE created_at >= '2023-11-15' СУБД будет сканировать только партицию p_2023_11 (partition pruning).
  • Упрощение управления данными: Удаление старых данных выполняется мгновенно удалением всей партиции: ALTER TABLE application_logs DROP PARTITION p_2023_10;
  • Параллельное выполнение: Запросы могут выполняться параллельно по разным партициям.

Недостатки и ограничения:

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