База данных PostgreSQL: полный обзор, плюсы, минусы и пределы
Для чего нужна база данных PostgreSQL, где она лучший выбор, а где выигрывает другая: плюсы и минусы, сравнение с MySQL, SQLite, MongoDB и ClickHouse, расширения, примеры SQL, пределы и советы.
Коротко
PostgreSQL — бесплатная база данных с открытым кодом и строгим отношением к данным: транзакции, ограничения и одна из самых полных реализаций SQL. Кроме обычных таблиц она хранит JSON с индексами, геоданные (PostGIS), векторы для ИИ-поиска (pgvector) и временные ряды (TimescaleDB) — одна база часто закрывает то, для чего раньше ставили три. Это выбор по умолчанию для бэкенда веб-сервисов и SaaS, интернет-магазинов и финансов. Слабые места: каждое подключение — отдельный процесс (нужен пулер подключений), обновления оставляют старые версии строк, которые убирает VACUUM, а аналитику по миллиардам строк и горизонтальное масштабирование записи лучше отдать другим системам.
PostgreSQL коротко: паспорт базы
Главные факты одной таблицей: откуда база взялась, как она бережёт данные и как развивается.
- Тип
- Объектно-реляционная система управления базами данных с открытым кодом
- История
- Проект POSTGRES в Беркли под руководством Майкла Стоунбрейкера с 1986 года; SQL — с 1995-го; имя PostgreSQL — с 1996-го
- Разработка
- PostgreSQL Global Development Group — сообщество; у проекта нет компании-владельца
- Лицензия
- PostgreSQL License — свободная, в том числе для коммерции
- Транзакции
- ACID и MVCC: чтение не блокирует запись
- SQL
- Одна из самых полных реализаций: CTE, оконные функции,
MERGE, SQL/JSON - JSON
jsonbс 2014 года: двоичный JSON с индексами- Индексы
- B-tree, Hash, GIN, GiST, SP-GiST, BRIN; частичные и по выражению
- Расширения
- PostGIS, pgvector, TimescaleDB, Citus и сотни других
- Репликация
- Потоковая — с 2010 года, логическая — с 2017-го
- Релизы
- Мажорная версия раз в год, поддержка пять лет; исправления — не реже раза в квартал
- Популярность
- С 2023 года — самая используемая база у разработчиков в опросе Stack Overflow
Для чего применяется PostgreSQL: 8 сфер
Основа — классические транзакционные данные, но расширения превратили PostgreSQL в платформу. Под каждой сферой — инструменты и расширения, на которых она держится.
-
01
Бэкенд веб-сервисов и SaaS
Пользователи, подписки, заказы и права: данные со строгими связями между таблицами. Её поддерживает любой популярный фреймворк.
-
02
Интернет-магазины и платежи
Транзакции гарантируют, что деньги и остатки не разойдутся: операция сохраняется целиком или не сохраняется вовсе.
-
03
Геоданные и карты
«Ближайшие магазины», зоны доставки, маршруты: PostGIS — стандарт для пространственных данных.
-
04
Поиск по сайту
Полнотекстовый поиск с учётом словоформ и ранжированием и поиск с опечатками — без отдельного поискового движка.
-
05
Векторный поиск и ИИ
Эмбеддинги рядом с данными, которые они описывают: смысловой поиск и RAG в той же базе, где товары и пользователи.
-
06
Временные ряды и метрики
Показания датчиков, события, цены: разбиение по времени и сжатие для многолетней истории.
-
07
Документы и JSON
Гибкие атрибуты, настройки и ответы внешних сервисов в
jsonb— с индексами, рядом со строгими колонками. -
08
Очереди задач
Фоновые задачи, письма и вебхуки без отдельного брокера: воркеры разбирают задачи, не мешая друг другу.
Плюсы и минусы PostgreSQL
PostgreSQL ставит правильность данных на первое место. Отсюда большинство её сильных сторон — и большая часть настройки, которая ей нужна.
Плюсы · 8
-
Надёжные транзакции
ACID, журнал упреждающей записи и восстановление на любой момент времени: после сбоя база поднимается согласованной.
-
Богатый SQL
CTE, оконные функции,
LATERAL, upsert иMERGE: отчёты и сложная логика пишутся в базе, а не циклами в коде. -
JSON с индексами
jsonbдаёт гибкость документов, не отнимая транзакций, связей и ограничений. -
Расширения
PostGIS, pgvector, TimescaleDB, pg_cron: новые возможности подключаются в ту же базу и тот же SQL.
-
Индекс на любой случай
Частичные и по выражению, GIN для JSON и текста, BRIN для огромных таблиц, упорядоченных по времени.
-
Строгие данные
Типы, внешние ключи, ограничения
CHECKиUNIQUEне пускают плохие данные на входе, а не в отчёте через месяц. -
Нет привязки к вендору
Свободная лицензия и сообщество вместо компании-владельца: ни платы за лицензии, ни риска, что продукт закроют.
-
Есть в любом облаке
AWS, Google Cloud, Azure, Supabase, Neon и локальные облачные провайдеры дают её как сервис с резервными копиями и репликами из коробки.
Минусы · 8
-
Процесс на подключение
Каждое подключение стоит памяти, а по умолчанию их всего 100. Сотням веб-процессов нужен пулер вроде PgBouncer.
-
VACUUM и раздувание
Обновление пишет новую версию строки, старую убирает автовакуум. Если он не успевает, таблицы и индексы разбухают.
-
Масштабирование записи
Чтение масштабируется репликами, а вся запись идёт на один главный сервер. Шардинг — это Citus или своя логика.
-
Скромные настройки по умолчанию
Из коробки база настроена под слабую машину:
shared_buffers,work_memи автовакуум нужно выставить под реальную нагрузку. -
Переход на новую версию — с планом
Минорные обновления простые, а мажорная версия требует
pg_upgradeили логической репликации, и каждое расширение должно её поддерживать. -
Строчное хранение для аналитики
Пройтись по миллиардам строк ради пары колонок медленно — для этого созданы колоночные базы вроде ClickHouse.
-
Дорогие частые обновления
Из-за версий строк таблица, где одни и те же строки меняются тысячи раз в секунду, создаёт много записи и работы по уборке.
-
Нужен присмотр администратора
Резервные копии, мониторинг, медленные запросы и рост диска требуют регулярного внимания — или управляемого сервиса, который делает это за вас.
PostgreSQL и другие базы: сравнение с MySQL, SQLite, MongoDB и ClickHouse
Качественное сравнение с базами, с которыми PostgreSQL выбирают чаще всего. Точные цифры зависят от данных и запросов, поэтому в таблице — взаимное положение, а не бенчмарки.
| Критерий | PostgreSQL | MySQL | SQLite | MongoDB | ClickHouse |
|---|---|---|---|---|---|
| Модель данных | таблицы плюс JSON, геоданные, векторы | таблицы | таблицы в одном файле | документы | колоночные таблицы |
| Транзакции | полный ACID | ACID с InnoDB | ACID, один писатель за раз | многодокументные с версии 4.0 | ограниченные |
| Язык запросов | самый богатый SQL | SQL, возможностей меньше | SQL | свой язык запросов | диалект SQL для аналитики |
| JSON | jsonb с индексами GIN | тип JSON, индексы по выражениям | функции для JSON | родной формат | тип JSON |
| Масштабирование | реплики на чтение; шардинг через Citus | реплики, зрелые инструменты | одна машина | встроенный шардинг | кластеры с шардами |
| Аналитика на миллиардах строк | медленно без расширений | медленно | не для этого | средне | лучше всех |
| Эксплуатация | сервер, нужны настройка и пулер | сервер, легко начать | сервера нет вовсе | сервер или кластер | сервер или кластер |
| Лицензия | PostgreSQL License, свободная | GPL, принадлежит Oracle | общественное достояние | SSPL, не открытая | Apache 2.0 |
| Сильнее всего в | веб-сервисах, SaaS, деньгах, смешанных данных | классических сайтах и CMS | приложениях, прототипах, небольших сайтах | документах с меняющейся структурой | событиях, логах, аналитике |
Когда брать PostgreSQL, а когда нет
Тринадцать типичных задач с вердиктом. Где PostgreSQL не лучший выбор, названа альтернатива.
-
Бэкенд веб-сервиса или SaaS
Лучший выборВыбор по умолчанию: строгие данные, транзакции и поддержка в любом фреймворке.
-
Интернет-магазин, платежи, учёт
Лучший выборТранзакции и ограничения держат деньги и остатки согласованными.
-
Геоданные и карты
Лучший выборPostGIS — отраслевой стандарт пространственных запросов.
-
Таблицы плюс гибкий JSON
Лучший выборjsonb с индексами избавляет от отдельной документной базы.
-
Векторный поиск для RAG
Лучший выборpgvector справляется с миллионами векторов рядом с данными, которые они описывают.
-
Поиск по сайту
ПодходитВстроенного полнотекстового поиска хватает большинству сайтов; для сложной релевантности — Elasticsearch или Meilisearch.
-
Очередь задач
ПодходитSKIP LOCKED хватает до тысяч задач в секунду; дальше — RabbitMQ, NATS или Kafka.
-
Временные ряды
ПодходитС TimescaleDB — да; при огромном потоке записи смотрите на ClickHouse.
-
Простой контентный сайт
ПодходитПодойдёт, но CMS на MySQL или SQLite проще в эксплуатации.
-
Аналитика по миллиардам событий
Другой языкClickHouse: колоночное хранение здесь в разы быстрее.
-
Кеш и сессии
Другой языкRedis или Valkey: данные в памяти, доступ за микросекунды.
-
База внутри приложения или устройства
Другой языкSQLite: один файл, без сервера.
-
Хранение файлов и картинок
Другой языкОбъектное хранилище вроде S3; в базе — только ссылка и описание.
Экосистема PostgreSQL: инструменты для частых задач
Многое встроено, остальное — расширения и отдельные инструменты. Средняя колонка — то, что идёт вместе с самой PostgreSQL.
| Задача | Встроено | Расширения и инструменты |
|---|---|---|
| Пул подключений | — | PgBouncer, PgCat |
| Резервные копии | pg_dump, pg_basebackup | pgBackRest, Barman, WAL-G |
| Отказоустойчивость | streaming replication | Patroni, CloudNativePG |
| Статистика запросов | pg_stat_statements | pgBadger, postgres_exporter |
| Планы запросов | EXPLAIN ANALYZE, auto_explain | explain.dalibo.com |
| Геоданные | — | PostGIS |
| Векторы | — | pgvector |
| Временные ряды | partitioning | TimescaleDB |
| Шардинг | partitioning, postgres_fdw | Citus |
| Полнотекстовый поиск | tsvector, pg_trgm | ParadeDB |
| Задачи по расписанию | — | pg_cron |
| Очереди | SKIP LOCKED, LISTEN/NOTIFY | pgmq, River, Graphile Worker |
| Миграции схемы | — | Flyway, Liquibase, Atlas, goose |
| Администрирование | psql | pgAdmin, DBeaver, DataGrip |
Пределы PostgreSQL: где она упирается
-
Тысячи прямых подключений
Если веб-сервер может открыть больше процессов, чем база принимает подключений, пик трафика кладёт все сайты на ней разом. Решается пулером перед базой.
-
Горячие строки, которые обновляют без конца
Счётчики, балансы и статусы, которые меняются тысячи раз в секунду, плодят мёртвые версии строк быстрее, чем их убирает автовакуум. Обновляйте пачками или вынесите счётчики в Redis.
-
Аналитика по миллиардам строк
Строчное хранение читает строки целиком при каждом проходе. Для аналитики событий и логов колоночная база быстрее на порядок.
-
Один сервер на всю запись
Когда один главный сервер уже не вытягивает запись, следующий шаг — шардинг через Citus или разделение данных по сервисам. Это серьёзный проект.
-
Файлы внутри базы
В поле помещается до 1 ГБ, но картинки и документы в таблицах раздувают резервные копии и реплики. Файлы — в объектное хранилище.
-
Изменение схемы больших таблиц
Часть операций
ALTER TABLEблокирует таблицу или переписывает её целиком. На таблицах в сотни миллионов строк миграции требуют плана и тайм-аута блокировки.
8 советов, как работать с PostgreSQL без шишек
-
01
Пулер подключений с первого дня
PgBouncer в режиме транзакций позволяет сотням веб-процессов делить несколько десятков настоящих подключений.
-
02
Включите pg_stat_statements
Он показывает, какие запросы суммарно съедают больше всего времени, — с них и начинать оптимизацию, а не с догадок.
-
03
EXPLAIN перед индексом
EXPLAIN (ANALYZE, BUFFERS)показывает настоящий план и куда уходит время. Индекс, добавленный наугад, может так и не использоваться. -
04
Индексы под запросы, а не на всякий случай
Каждый индекс замедляет запись и занимает диск. Неиспользуемые удаляйте — статистика их показывает.
-
05
Автовакуум настраивать, а не отключать
Для больших и нагруженных таблиц снижайте пороги, чтобы уборка шла чаще и небольшими порциями.
-
06
Проверяйте копии восстановлением
pgBackRest с архивом WAL даёт восстановление на любой момент. Копия, которую никто не восстанавливал, — это только надежда.
-
07
Миграции без долгих блокировок
CREATE INDEX CONCURRENTLY, короткийlock_timeoutи большие изменения по шагам — и сайт не встаёт. -
08
Правильные типы
timestamptzдля времени,numericдля денег,textсCHECKвместоvarchar(n), identity-колонки вместо serial.
Как выглядит PostgreSQL: 3 примера SQL
Три примера к главным плюсам PostgreSQL: строгие таблицы с JSON, отчёты прямо в базе и очередь задач без отдельного брокера. Проверены на PostgreSQL 16.
Строгие колонки и JSON в одной таблице
Ограничения охраняют поля с известными правилами, jsonb хранит остальное, а индекс GIN находит заказы по любому ключу внутри JSON.
-- заказ: строгие колонки там, где правила известны, и JSON для остального
CREATE TABLE orders (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
customer_id bigint NOT NULL REFERENCES customers (id),
total numeric(12, 2) NOT NULL CHECK (total >= 0),
status text NOT NULL DEFAULT 'new',
details jsonb NOT NULL DEFAULT '{}',
created_at timestamptz NOT NULL DEFAULT now()
);
-- индекс по любым полям внутри JSON
CREATE INDEX orders_details_idx ON orders USING gin (details);
-- заказы с доставкой курьером
SELECT id, total
FROM orders
WHERE details @> '{"delivery": "courier"}';
Отчёт и upsert прямо в базе
Оконная функция ранжирует клиентов внутри каждого месяца одним запросом, а ON CONFLICT вставляет строку или обновляет существующую за одну операцию.
-- выручка по месяцам и место клиента внутри месяца
SELECT date_trunc('month', created_at) AS month,
customer_id,
sum(total) AS revenue,
rank() OVER (PARTITION BY date_trunc('month', created_at)
ORDER BY sum(total) DESC) AS place
FROM orders
GROUP BY 1, 2
ORDER BY month, place;
-- остаток на складе: вставить или прибавить к существующему одной командой
INSERT INTO stock (sku, qty) VALUES ('A-100', 5)
ON CONFLICT (sku) DO UPDATE SET qty = stock.qty + EXCLUDED.qty;
Очередь задач без брокера
Каждый воркер берёт одну задачу из очереди; благодаря SKIP LOCKED остальные её пропускают, а не ждут, и одну задачу никогда не возьмут дважды.
-- воркер забирает следующую задачу; соседние воркеры её пропустят, а не будут ждать
WITH next AS (
SELECT id
FROM jobs
WHERE status = 'queued'
ORDER BY created_at
FOR UPDATE SKIP LOCKED
LIMIT 1
)
UPDATE jobs
SET status = 'running', started_at = now()
FROM next
WHERE jobs.id = next.id
RETURNING jobs.id, jobs.payload;
Вопросы о PostgreSQL
Что такое PostgreSQL простыми словами?
Бесплатная база данных, которая хранит данные приложения в таблицах и гарантирует, что они не потеряются и не испортятся. На ней работают сайты, онлайн-сервисы, магазины и банки — от маленьких проектов до очень больших.
Как правильно произносить PostgreSQL?
«Постгрес-кью-эль». Короткое название Postgres тоже официально принято.
PostgreSQL или MySQL?
Для нового веб-сервиса или SaaS PostgreSQL обычно лучше: богаче SQL, JSON с индексами, расширения и строже данные. MySQL проще на старте и подходит для классических сайтов и CMS, где она уже стандарт.
Можно ли заменить MongoDB на PostgreSQL?
В большинстве проектов — да: jsonb с индексами GIN хранит документы и ищет по ним, сохраняя транзакции и связи. MongoDB остаётся сильнее там, где нужен встроенный шардинг огромных коллекций документов.
PostgreSQL бесплатная?
Да, полностью, в том числе для коммерции. Она распространяется по лицензии PostgreSQL License, похожей на MIT и BSD; платить приходится только за серверы или управляемый сервис.
Сколько данных выдержит PostgreSQL?
Терабайты на одном сервере — обычное дело. С размером блока по умолчанию таблица может вырасти до 32 ТБ, одно поле — до 1 ГБ; за пределами одной машины используют шардинг через Citus.
Нужен ли Redis, если есть PostgreSQL?
На старте часто нет: PostgreSQL справится с очередями, простым кешем и сессиями. Redis или Valkey окупаются для горячих счётчиков, ограничения частоты запросов и кеша с доступом за микросекунды.
Подходит ли PostgreSQL для аналитики?
Для отчётов по миллионам и десяткам миллионов строк — да, благодаря оконным функциям и параллельным запросам. Для миллиардов событий колоночная база вроде ClickHouse намного быстрее.
Форма
Базы данных
на PostgreSQL
Работаю с PostgreSQL в своих проектах: проектирую схему под задачу, ускоряю медленные запросы, настраиваю индексы, резервные копии и подключения. Расскажите о задаче — отвечу в течение рабочего дня.