← Назад к вопросам

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

3.0 Senior🔥 151 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Партиционирование в базах данных

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

Основные типы партиционирования

1. Range-партиционирование

Данные разделяются по диапазонам значений. Часто используется для временных данных:

// SQL пример для PostgreSQL
CREATE TABLE orders (
    id SERIAL,
    order_date DATE,
    amount DECIMAL
) PARTITION BY RANGE (YEAR(order_date));

CREATE TABLE orders_2023 PARTITION OF orders
    FOR VALUES FROM (2023) TO (2024);
    
CREATE TABLE orders_2024 PARTITION OF orders
    FOR VALUES FROM (2024) TO (2025);

2. List-партиционирование

Данные разделяются по конкретным значениям:

// Партиционирование по странам
CREATE TABLE users (
    id INT,
    country VARCHAR(50),
    name VARCHAR(100)
) PARTITION BY LIST (country);

CREATE TABLE users_russia PARTITION OF users
    FOR VALUES IN (RU, Russia);
    
CREATE TABLE users_usa PARTITION OF users
    FOR VALUES IN (US, USA);

3. Hash-партиционирование

Данные распределяются по хеш-функции:

// Равномерное распределение данных
CREATE TABLE transactions (
    id BIGINT,
    user_id INT,
    amount DECIMAL
) PARTITION BY HASH (user_id);

CREATE TABLE transactions_shard_0 PARTITION OF transactions
    FOR VALUES WITH (MODULUS 4, REMAINDER 0);
    
CREATE TABLE transactions_shard_1 PARTITION OF transactions
    FOR VALUES WITH (MODULUS 4, REMAINDER 1);

Преимущества партиционирования

Улучшение производительности:

  • Запросы работают только с нужными партициями (partition pruning)
  • Индексы меньше и быстрее
  • Параллельная обработка партиций

Управление данными:

  • Легко удалять старые данные (drop partition вместо DELETE)
  • Проще выполнять maintenance операции
  • Быстрее архивирование

Масштабируемость:

  • Распределение нагрузки между серверами (sharding)
  • Независимое управление каждой партицией
  • Возможность горизонтального масштабирования

Недостатки и вызовы

  • Сложность планирования запросов — optimizer должен правильно выбрать партиции
  • Запросы без ключа партиционирования — выполняют seq scan по всем партициям
  • Maintenance — нужно управлять партициями (создание, удаление, архивирование)
  • Overhead — для маленьких таблиц может быть медленнее, чем без партиционирования

Пример: Java приложение с партиционированной БД

@Repository
public class OrderRepository {
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    // Благодаря partition pruning, запрос автоматически
    // выполняется только на партиции за 2024 год
    public List<Order> findOrdersByDate(LocalDate startDate, LocalDate endDate) {
        String sql = "SELECT * FROM orders WHERE order_date >= ? AND order_date < ?";
        return jdbcTemplate.query(sql, new Object[]{startDate, endDate},
            (rs, rowNum) -> new Order(
                rs.getLong("id"),
                rs.getDate("order_date").toLocalDate(),
                rs.getBigDecimal("amount")
            ));
    }
    
    // Hash-партиционирование для sharding
    public List<Transaction> findUserTransactions(int userId) {
        String sql = "SELECT * FROM transactions WHERE user_id = ?";
        return jdbcTemplate.query(sql, new Object[]{userId},
            (rs, rowNum) -> new Transaction(
                rs.getLong("id"),
                rs.getInt("user_id"),
                rs.getBigDecimal("amount")
            ));
    }
}

Когда использовать партиционирование

✓ Таблицы с миллионами/миллиардами строк ✓ Данные временные (логи, метрики, события) ✓ Нужна архивация старых данных ✓ Требуется horizontal scaling (sharding) ✓ Есть очевидный ключ партиционирования (дата, регион, пользователь)

✗ Маленькие таблицы ✗ Нет явного критерия для разделения ✗ Частые запросы без фильтра по ключу партиционирования

Партиционирование — это мощный инструмент, но требует тщательного проектирования и понимания характеристик данных.

Как работает партиционирование в базах данных? | PrepBro