✉️ Пост 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 нагрузка будет неравномерной
· 09.04
И еще. Если дело в отсутствии места, нужно использовать сжатие (актуально для OLAP СУБД). Если дело в отсутствии места и дополнительно - в оптимизации запросов, делите данные на "горячие" и "холодные". Последние выносите в DFS (Hadoop, S3, etc) или во внешние СУБД и подключайте через external tables. Но это опять же про OLAP MPP. А оптимизацию запросов в них можно осуществлять через применение колоночного хранения, дистрибуцию, оптимизацию самого SQL, отказа от delete и update в пользу сторнирования, проектирование оптимальной модели данных и т.д. Короче, глубокий творческий процесс, в котором, как правило, партиционирование не особо востребовано
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён