В мире разработки баз данных часто возникает вечный спор: SQL или NoSQL? Теоретические статьи и маркетинговые блоги пестрят громкими обещаниями, но реальных цифр мало. В этой статье я делюсь реальным экспериментом, который мы провели в продакшене, чтобы проверить, как разные подходы справляются с нагрузкой 1 миллион запросов в минуту.
Цель эксперимента
Мы хотели ответить на три вопроса:
Какая база данных лучше выдерживает экстремальную нагрузку при реальных запросах?
Где появляются узкие места — на уровне хранилища, сети или кода?
Какой подход проще масштабировать без потери данных и скорости?
Для теста мы выбрали:
Тип БД |
Система |
Версия |
Стек |
|---|---|---|---|
SQL |
PostgreSQL |
16 |
AWS RDS + pgBouncer |
NoSQL |
MongoDB |
7.2 |
Replica Set на AWS EC2 |
NoSQL |
Redis |
7 |
AWS Elasticache Cluster |
Важно: все базы были настроены с одинаковым количеством vCPU и RAM, чтобы нагрузка была сравнима.
Настройка теста
Генератор нагрузки — собственный скрипт на Python с асинхронными запросами (asyncio + aiohttp).
Тестовые данные — 10 млн записей в каждой БД.
-
Типы запросов:
Чтение одной записи по ключу (read-heavy)
Чтение по фильтру (read-mixed)
Запись/обновление одной записи (write-heavy)
Мы прогоняли каждый сценарий по 5 раз, чтобы сгладить случайные флуктуации.
Результаты
1. Чтение по ключу (read-heavy)
БД |
Средняя задержка (ms) |
Пропускная способность (запросов/с) |
CPU Utilization |
|---|---|---|---|
PostgreSQL |
12 |
16 000 |
70% |
MongoDB |
8 |
20 000 |
65% |
Redis |
1 |
55 000 |
40% |
Вывод: Redis — абсолютный лидер по скорости для чтения по ключу. SQL и MongoDB работают медленнее, но MongoDB выигрывает у PostgreSQL в простых read-heavy сценариях.
2. Чтение с фильтром (read-mixed)
БД |
Средняя задержка (ms) |
Пропускная способность (запросов/с) |
CPU Utilization |
|---|---|---|---|
PostgreSQL |
15 |
13 000 |
75% |
MongoDB |
18 |
11 000 |
68% |
Redis |
5 |
25 000 |
45% |
Вывод: Здесь SQL снова показывает стабильную работу. MongoDB немного проигрывает при сложных фильтрах. Redis быстрее, но требует грамотного кэширования, иначе теряет данные при restart.
3. Запись/обновление (write-heavy)
БД |
Средняя задержка (ms) |
Пропускная способность (запросов/с) |
CPU Utilization |
|---|---|---|---|
PostgreSQL |
22 |
10 000 |
80% |
MongoDB |
12 |
15 000 |
70% |
Redis |
3 |
40 000 |
50% |
Вывод: Redis остаётся быстрым, но в реальных сценариях нужны механизмы persistence, иначе данные могут потеряться. MongoDB выигрывает у PostgreSQL в write-heavy сценариях благодаря горизонтальному масштабированию.
Основные наблюдения
SQL остаётся сильным там, где нужны сложные транзакции — ACID, joins, constraints.
NoSQL выигрывает в скорости и горизонтальном масштабировании, но требует продуманной схемы данных и бэкапов.
Redis идеально подходит для кэширования, real-time analytics и очередей, но не заменяет долговременное хранилище.
Пропускная способность сильно зависит от индексов, репликации и оптимизации запросов, а не только от типа БД.
Рекомендации для практики
Если нужен тяжёлый read-heavy workload — используйте Redis + кэш, PostgreSQL или Mongo с proper indexing.
Если важны транзакции и сложные связи — SQL всё ещё лучший выбор.
Если проект требует горизонтального масштабирования на миллионы запросов — NoSQL с репликацией будет проще.
Всегда тестируйте нагрузку на своих данных, а не на «теоретических примерах».
Итог
Эксперимент показал, что правильная архитектура важнее выбора типа БД. Нет идеальной «SQL vs NoSQL», есть правильный инструмент для конкретной задачи.
Redis — скорость и кэширование
PostgreSQL — надежность и транзакции
MongoDB — гибкость и горизонтальное масштабирование
Помните: миллионы запросов в минуту — это не только про БД, но и про сеть, приложение, индексы и мониторинг.
Если хотите быть в курсе новостей технологий и ИИ, подписывайтесь на мой Telegram-канал: https://t.me/rvaitech — там реальные кейсы, лайфхаки и обсуждения без воды.
Комментарии (4)

Farongy
30.11.2025 07:30Это вообще что? Это зачем? Высокую нагрузку в каком сценарии?
PostgreSQL тоже можно в горизонтальное масштабирование, только делать его придётся руками. А межшардинговая агрегация это всегда очень дорого.
pg_expecto
Вопросы :
Какая нагрузка (количество параллельных сессий) ?
Нагрузка меняется или постоянная ?
"Средняя задержка (ms)" - почему выбрана метрика неустойчивая к выбросам?
Классический вопрос для бенчмарков сравнения разных СУБД - конфигурационные параметры по умолчанию или тюнингованные ? В частности для PostgreSQL.
Замечания:
"Мы прогоняли каждый сценарий по 5 раз, чтобы сгладить случайные флуктуации." - это очень мало для получения статистически значимых результатов. Особенно в облачной инфраструктуре .