Базы данных• Гайды по выбору

Сколько оперативной памяти нужно серверу под PostgreSQL и MySQL

Формулы расчёта shared_buffers, innodb_buffer_pool_size и work_mem. Как не переплатить за RAM и не упереться в swap при росте базы.

Обновлено: 2026-10-11T06:00:02.524Z
Время чтения: ~10 мин
Автор: Алексей Кузнецов (Ведущий системный архитектор)
Быстрый ответ & Краткая суть

Для PostgreSQL выделяйте shared_buffers = 25% RAM, effective_cache_size = 75% RAM. Для MySQL — innodb_buffer_pool_size = 70–80% RAM. Минимально: 4 ГБ RAM для баз до 10 ГБ, 16 ГБ для баз до 50 ГБ, 64+ ГБ для баз свыше 100 ГБ. Ключевое: размер рабочего набора (hot data + индексы) должен помещаться в RAM.

База до 10 ГБ4–8 ГБ RAM
База 10–50 ГБ16–32 ГБ RAM
База 50–200 ГБ64–128 ГБ RAM
shared_buffers (PG)25% от общей RAM
Ключевые выводы и краткая суть
  • PostgreSQL: shared_buffers = 25% от RAM, effective_cache_size = 75% от RAM, work_mem = RAM / (max_connections × 2).
  • MySQL/MariaDB: innodb_buffer_pool_size = 70–80% от RAM для выделенного сервера СУБД.
  • Правило: если размер рабочего набора данных ≤ RAM — СУБД работает из кэша. Если > RAM — начинаются дисковые чтения и просадка в 100–1000×.
  • Минимум для продакшен PostgreSQL: 4 ГБ RAM (база до 10 ГБ). Рекомендуемо: RAM ≥ размер активных индексов + 20%.

Как СУБД использует оперативную память

И PostgreSQL, и MySQL/MariaDB активно кэшируют данные в RAM. Когда запрос обращается к строке таблицы, СУБД сначала ищет её в буферном кэше (RAM). Если нашла — отдаёт мгновенно (микросекунды). Если нет — читает с диска (миллисекунды). Разница — в 100–1000 раз.

Именно поэтому RAM — самый важный ресурс для СУБД после CPU. Чем больше данных помещается в кэш, тем быстрее работают запросы. Правило: если ваш «горячий» набор данных (часто запрашиваемые таблицы и индексы) умещается в RAM — база летает.

PostgreSQL: формулы расчёта

Ключевые параметры PostgreSQL и их зависимость от RAM:

postgresql.conf
# postgresql.conf — оптимальные настройки для 32 ГБ RAM

# Буферный пул (25% от RAM)
shared_buffers = 8GB

# Подсказка планировщику: сколько данных ОС кэширует (75% RAM)
effective_cache_size = 24GB

# Память на одну операцию сортировки/хеширования
# Формула: RAM / (max_connections * 2)
work_mem = 64MB       # 32GB / (200 * 2) ≈ 80MB, берём 64MB с запасом

# Память для операций обслуживания (VACUUM, CREATE INDEX)
maintenance_work_mem = 2GB

# Максимум подключений (каждое ~10 МБ)
max_connections = 200
Осторожно с work_memwork_mem выделяется на каждую операцию сортировки в каждом подключении. При 200 подключениях и work_mem = 256MB в теории может быть израсходовано 200 × 256MB = 50 ГБ. Ставьте консервативно и поднимайте для конкретных запросов через SET work_mem.

MySQL/MariaDB: формулы расчёта

В MySQL основной кэш — innodb_buffer_pool_size. На выделенном сервере СУБД он должен занимать 70–80% от общей RAM. На сервере, где помимо MySQL работает веб-сервер — 50–60%.

my.cnf
# my.cnf — оптимальные настройки для 16 ГБ RAM

[mysqld]
# Основной буферный пул (70% от RAM для выделенного СУБД-сервера)
innodb_buffer_pool_size = 11G

# Количество инстансов буферного пула (по 1 на ядро, макс 64)
innodb_buffer_pool_instances = 8

# Размер лога (10–25% от buffer_pool)
innodb_log_file_size = 2G

# Кэш для MyISAM-таблиц (если используются)
key_buffer_size = 256M

# Сортировка и join
sort_buffer_size = 4M
join_buffer_size = 4M

# Подключения
max_connections = 150

Как определить нужный объём RAM для вашей базы

Шаг 1: Узнайте размер базы данных. В PostgreSQL: SELECT pg_size_pretty(pg_database_size(current_database())). В MySQL: SELECT table_schema, ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS size_mb FROM information_schema.tables GROUP BY table_schema.

Шаг 2: Узнайте размер индексов. В PostgreSQL: SELECT pg_size_pretty(pg_indexes_size('your_table')). Индексы — это «горячие» данные, которые должны полностью помещаться в RAM.

Шаг 3: Оцените рабочий набор. Обычно это 20–40% от общего размера базы. Если у вас интернет-магазин с базой 100 ГБ, но активно используются только заказы за последний месяц (20 ГБ) — рабочий набор ~20 ГБ.

Шаг 4: RAM ≥ рабочий набор + индексы + 30% на ОС и подключения. Для нашего примера: 20 + 8 (индексы) + 30% ≈ 36 ГБ → берите сервер с 32–64 ГБ RAM.

Рекомендованные конфигурации по теме статьи

Проверенные серверы от надежных провайдеров

Весь каталог
Timeweb Cloud
Перейти
Хит цены
Timeweb Cloud

Timeweb Cloud

Москва★ 4.8

Cloud Start

CPU

1 ядер • 3.3 ГГц

RAM

1 ГБ

Диск

15 ГБ NVMe

Канал

200 Мбит/с

299 ₽/мес

Timeweb Cloud

Timeweb Cloud

Москва★ 4.8

Cloud Basic

CPU

2 ядер • 3.3 ГГц

RAM

2 ГБ

Диск

40 ГБ NVMe

Канал

200 Мбит/с

499 ₽/мес

152-ФЗ
Selectel

Selectel

Москва★ 4.9

Cloud Lite 1

CPU

1 ядер • 2.6 ГГц

RAM

1 ГБ

Диск

10 ГБ SSD

Канал

200 Мбит/с

550 ₽/мес

Часто задаваемые вопросы (FAQ)

Что происходит, когда RAM не хватает для СУБД?

СУБД начинает читать данные с диска вместо кэша. Скорость запросов падает в 100–1000 раз. Если при этом включён swap — система может «встать» полностью из-за thrashing (постоянного обмена между RAM и диском).

Стоит ли добавлять swap для СУБД?

Небольшой swap (1–2 ГБ) полезен как страховка от OOM Killer. Но если СУБД активно использует swap — это симптом нехватки RAM. Срочно увеличивайте память или оптимизируйте запросы.