PostgreSQL
| Тип | объектно-реляционная СУБД |
|---|---|
| Разработчик | PostgreSQL Global Development Group |
| Первый выпуск | 1996 (как PostgreSQL; проект POSTGRES — с 1986) |
| Язык реализации | C |
| Лицензия | PostgreSQL License (разрешительная, в духе BSD/MIT) |
| Порт по умолчанию | 5432 |
| Цикл выпусков | мажорная версия ежегодно, поддержка 5 лет |
| Сайт | postgresql.org |
PostgreSQL (произносится «пост-грес-кью-эль», в обиходе — Postgres) — свободная объектно-реляционная система управления базами данных. Она известна строгим следованием стандарту SQL, надёжными транзакциями, богатым набором типов данных и механизмом расширений, который позволяет добавлять новые типы, функции, индексы и даже языки программирования. По опросам разработчиков Stack Overflow PostgreSQL с 2023 года — самая используемая база данных.[8]
История
Проект начался в 1986 году в Калифорнийском университете в Беркли под руководством Майкла Стоунбрейкера как преемник СУБД Ingres — отсюда название POSTGRES («после Ingres»). В нём впервые появились пользовательские типы данных и правила. В 1994 году Эндрю Ю и Джолли Чен заменили собственный язык запросов PostQUEL на SQL и выпустили Postgres95; в 1996 году проект переименовали в PostgreSQL и передали сообществу.[1]
Сегодня PostgreSQL развивает глобальная группа разработчиков, не принадлежащая какой-либо компании. Мажорная версия выходит раз в год (обычно осенью), каждая поддерживается пять лет; минорные выпуски с исправлениями выходят ежеквартально.[2] Лицензия PostgreSQL License разрешает любое, в том числе коммерческое, использование и модификацию, поэтому на его основе построены многие продукты и облачные сервисы.[3]
Архитектура
- Процесс на соединение. Главный процесс (postmaster) порождает отдельный серверный процесс для каждого клиента. Соединения дороги, поэтому перед базой часто ставят пулер вроде PgBouncer.
- MVCC. Изменение строки создаёт её новую версию, а старая остаётся видимой для транзакций, начавшихся раньше. Читатели не блокируют писателей и наоборот.[4] Устаревшие версии убирает фоновый процесс autovacuum (см. MVCC).
- WAL. Каждое изменение сначала записывается в журнал упреждающей записи (write-ahead log), и лишь потом — в файлы данных. Журнал обеспечивает восстановление после сбоя, резервное копирование на момент времени (PITR) и репликацию.[5]
- Оптимизатор запросов на основе стоимости собирает статистику по таблицам и выбирает план; посмотреть его можно командой EXPLAIN.
Возможности
- Полноценные транзакции, включая транзакционный DDL:
CREATE TABLEилиALTER TABLEможно откатить. Все уровни изоляции, включая настоящийSERIALIZABLE. - Типы данных: массивы,
jsonb(двоичный JSON с индексами), диапазоны,uuid, сетевые адреса, геометрия, перечисления, составные типы. - Индексы нескольких видов: B-tree, Hash, GiST, SP-GiST, GIN, BRIN; частичные, по выражениям и покрывающие индексы.[6]
- Оконные функции, рекурсивные CTE,
MERGE, полнотекстовый поиск, секционирование таблиц. - Хранимые процедуры на PL/pgSQL, а также на Python, Perl и других языках.
- Физическая (потоковая) и логическая репликация.
Расширения
Расширение подключается одной командой CREATE EXTENSION и может добавлять типы, операторы и методы индексирования. Самые известные:
| Расширение | Назначение |
|---|---|
| PostGIS | геопространственные данные и запросы |
| pgvector | хранение эмбеддингов и векторный поиск |
| pg_stat_statements | статистика выполнения запросов |
| TimescaleDB | временные ряды |
| Citus | распределение таблиц по узлам (шардирование) |
| pg_trgm | поиск по сходству строк (триграммы) |
Благодаря расширениям PostgreSQL часто заменяет сразу несколько специализированных систем: документную базу, геоинформационную систему и векторное хранилище для RAG.
Практика
Быстрее всего запустить PostgreSQL в Docker:
docker run -d --name pg -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres:18
psql -h localhost -U postgres
-- в psql
\l -- список баз
\dt -- таблицы текущей схемы
\d+ orders -- структура таблицы
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 42;
Полезные практики: включить pg_stat_statements для поиска медленных запросов, следить за работой autovacuum на часто обновляемых таблицах, делать резервные копии через pg_dump или непрерывное архивирование WAL, а изменения схемы проводить миграциями. Список изменений по версиям публикуется в примечаниях к выпускам.[7]
Сравнение
По сравнению с MySQL PostgreSQL исторически строже к типам и стандарту и богаче возможностями, MySQL — проще в репликации и распространён в веб-хостинге. SQLite — встраиваемая база без сервера, удобная для локальных приложений и тестов. Для аналитики над миллиардами строк используют колоночные СУБД вроде ClickHouse.
См. также
Источники
- PostgreSQL Documentation — A Brief History of PostgreSQL
- PostgreSQL — Versioning Policy
- PostgreSQL — License
- PostgreSQL Documentation — Concurrency Control (MVCC)
- PostgreSQL Documentation — Write-Ahead Logging
- PostgreSQL Documentation — Index Types
- PostgreSQL Documentation — Release Notes
- Stack Overflow Developer Survey — Databases