PostgreSQL и MySQL — две самые популярные open-source СУБД. Обе отлично подходят для веб-приложений, но имеют ключевые различия.
Соответствие стандартам SQL
PostgreSQL максимально следует стандарту SQL. MySQL имеет множество нестандартных расширений и иногда «молча» обрезает данные вместо ошибки.
Типы данных
PostgreSQL значительно богаче:
- JSONB — бинарный JSON с индексацией. MySQL поддерживает JSON, но без бинарного хранения
- ARRAY — нативные массивы. В MySQL нет
- hstore — key-value хранилище
- ENUM — оба поддерживают, но в PostgreSQL это настоящий тип
- UUID — нативный тип в PostgreSQL, в MySQL хранится как CHAR(36)
Оконные функции
PostgreSQL поддерживает полный набор оконных функций с версии 8.4 (2009). MySQL добавил их только в 8.0 (2018). PostgreSQL поддерживает больше вариантов frame clause.
CTE и рекурсивные запросы
Оба поддерживают WITH RECURSIVE. Но PostgreSQL позволяет использовать CTE для INSERT/UPDATE/DELETE (writeable CTE), MySQL — нет.
Производительность
- Чтение простых запросов — MySQL часто быстрее из-за более простого планировщика
- Сложные аналитические запросы — PostgreSQL значительно лучше благодаря оптимизатору
- Запись — PostgreSQL использует MVCC, MySQL (InnoDB) тоже, но реализация различается
- Конкурентный доступ — PostgreSQL лучше обрабатывает конкурентные транзакции
Репликация
MySQL: master-slave репликация «из коробки», Group Replication. PostgreSQL: streaming replication, логическая репликация с версии 10.
Расширяемость
PostgreSQL — чемпион. Можно создавать свои типы данных, операторы, индексные методы, процедурные языки (PL/pgSQL, PL/Python, PL/v8).
Когда что выбрать?
PostgreSQL:
- Сложная бизнес-логика и аналитика
- Работа с JSON/геоданными
- Строгая типизация и целостность данных
- Расширяемость
MySQL:
- Простые CRUD-приложения
- Максимальная скорость на простых запросах
- Широкая поддержка хостингов
- Экосистема WordPress/PHP