✉️ Пост 42. Что такое партиционирование в масштабировании БД и как это работает

Когда база данных начинает расти, наступает момент, когда один сервер уже не вывозит. Запросов становится много, данных становится много, таблицы весят сотни гигабайт, индексы раздуваются, запросы тормозят Тогда идут к масштабированию БД, например, с помощью партиционирования 🧠 Что такое партиционирование Партиционирование - это разделение большой таблицы или базы данных на части (партиции), чтобы данные хранились и обрабатывались не в одном огромном куске, а в нескольких.

Грубо: была одна огромная таблица стало несколько маленьких таблиц Но для приложения это всё ещё выглядит как одна таблица

📦 Простой пример Есть таблица заказов - orders В ней:

  • order_id
  • user_id
  • amount
  • created_at
  • status

Со временем там становится: 10 млн записей, 50 млн записей, 200 млн записей и тд

Любой запрос начинает страдать. Например: select * from orders where created_at >= '2025-01-01' База вынуждена сканировать огромный объём данных.

🔥Решение - как раз партиционирование Мы делим таблицу на части. Например по дате: orders_2023 orders_2024 orders_2025 Теперь запрос: select * from orders where created_at >= '2025-01-01' будет читать только: orders_2025 А не всю таблицу.

База автоматически понимает, какую именно часть читать.

⚙️ Как это работает внутри Партиционированная таблица - это по сути - orders (логическая таблица) под ней: orders_2023 orders_2024 orders_2025 Когда ты пишешь: select * from orders Субдшка сама решает, в какую партицию идти. Для разраба это всё выглядит как одна таблица.

🧩 Виды партиционирования 🔹 Range partitioning Деление по диапазону. Например:

  • по дате 2023 2024 2025
  • по ID 1-100000 100001-200000 Используется чаще всего. Подходит для логов заказов

🔹 List partitioning Деление по списку значений. Например:

  • по стране EU US ASIA
  • по статусу ACTIVE BLOCKED DELETED Каждое значение идет в свою партицию.

🔹 Hash partitioning - самый интересный способ, на мой взгляд Деление по хешу. hash(user_id) % 4 Получаем: partition 1 partition 2 partition 3 partition 4 Распределение равномерное. Используется для нагрузки.

🚀 Что такое **Вертикальное и горизонтальное партиционирование

🔹 Горизонтальное** Разделение строк. orders_2023 orders_2024 orders_2025 Строки распределяются по таблицам. Это классика

🔹 Вертикальное Разделение колонок. Было: orders

  • id
  • user_id
  • amount
  • description
  • payload

Стало: orders_main

  • id
  • user_id
  • amount orders_payload
  • id
  • description
  • payload

Тяжелые данные вынесены отдельно. Это уменьшает нагрузку.

Зачем это все дело нужно:Ускорение запросов Читается только нужная часть данных. Не вся таблица.

📉Снижение нагрузки Меньше сканирования, меньше индексов

🧹 Удобное удаление данных Можно просто удалить партицию: drop table orders_2022 вместо удаления миллионов строк. Это намного быстрее.

📦 Удобный архив Старые данные можно переносить отдельно.

⚠️ Проблемы партиционирования

  • сложнее индексы нужно следить за каждой партицией

  • сложнее join особенно если данные в разных партициях

  • неправильный ключ убьет систему если выбрать плохой partition key нагрузка будет неравномерной

✉️ Пост 42. Что такое партиционирование в масштабировании БД и как это работает
Когда база данных начинает расти, наступает момент, когда один сервер уже не вывозит | Сетка — социальная сеть от hh.ru