PostgreSQL vs MySQL — в чём разница и какую учить аналитику
Коротко
PostgreSQL и MySQL — две самые популярные open-source реляционные СУБД. Обе поддерживают SQL, таблицы, индексы и транзакции. Но для аналитика данных PostgreSQL — однозначный выбор: он мощнее в оконных функциях, CTE, типах данных и ближе к стандарту SQL. MySQL проще, быстрее в простых CRUD-операциях и до сих пор живёт в тысячах веб-проектов — но аналитические задачи на нём решать труднее.
Краткая история
PostgreSQL появился в 1986 году в Беркли как академический проект. Отсюда его философия: поддержка стандарта SQL, расширяемость, сложные типы данных. Сейчас развивается сообществом, нет единого владельца.
MySQL создан в 1995 году шведской компанией MySQL AB. Цель — быстрая и простая база данных для веб-приложений. В 2010 году куплена Oracle. После этого часть сообщества ушла в форк MariaDB.
Сравнение возможностей
| Возможность | PostgreSQL | MySQL |
|---|---|---|
| Оконные функции | полная поддержка (ROW_NUMBER, LEAD, LAG, NTILE, FILTER) | базовая поддержка с 8.0 (2018), нет FILTER |
| CTE (WITH) | рекурсивные и нерекурсивные, можно вставлять/обновлять внутри CTE | с 8.0, только SELECT |
| JSON | JSONB — бинарный формат, индексы, операторы @>, ?, -> |
JSON-тип, функции JSON_EXTRACT, JSON_TABLE |
| ARRAY | встроенный тип, ANY(), UNNEST() |
нет |
| Материализованные представления | CREATE MATERIALIZED VIEW, REFRESH |
нет (эмулируют через таблицы + триггеры) |
| Полнотекстовый поиск | tsvector, tsquery, ранжирование | FULLTEXT-индексы, проще, но менее гибко |
| Партиционирование | декларативное (RANGE, LIST, HASH) | RANGE, LIST, HASH, KEY |
| DISTINCT ON | да | нет |
| Расширения | PostGIS, pg_stat_statements, pgvector, 1000+ | плагины, но экосистема беднее |
Для аналитика критичны оконные функции, CTE и DISTINCT ON — в PostgreSQL они работают полноценно, в MySQL с ограничениями.
Отличия в синтаксисе
LIMIT и пагинация
-- PostgreSQL
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;
-- MySQL — то же самое, но есть и альтернативный синтаксис:
SELECT * FROM users ORDER BY id LIMIT 20, 10; -- OFFSET, countКонкатенация строк
-- PostgreSQL: оператор ||
SELECT first_name || ' ' || last_name AS full_name FROM users;
-- MySQL: функция CONCAT
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;Регистронезависимый поиск
-- PostgreSQL: ILIKE
SELECT * FROM products WHERE name ILIKE '%молоко%';
-- MySQL: LIKE по умолчанию регистронезависим (зависит от collation)
SELECT * FROM products WHERE name LIKE '%молоко%';Функции дат
-- PostgreSQL
SELECT DATE_TRUNC('month', created_at) FROM orders;
SELECT EXTRACT(DOW FROM created_at) FROM orders; -- 0=вс, 1=пн
-- MySQL
SELECT DATE_FORMAT(created_at, '%Y-%m-01') FROM orders;
SELECT DAYOFWEEK(created_at) FROM orders; -- 1=вс, 2=пнUPSERT
-- PostgreSQL: ON CONFLICT
INSERT INTO stats (user_id, score) VALUES (1, 100)
ON CONFLICT (user_id) DO UPDATE SET score = EXCLUDED.score;
-- MySQL: ON DUPLICATE KEY
INSERT INTO stats (user_id, score) VALUES (1, 100)
ON DUPLICATE KEY UPDATE score = VALUES(score);Кто использует что в России
PostgreSQL — стандарт в российских продуктовых компаниях для основной базы:
- Яндекс, Ozon, Авито, Тинькофф, СберМаркет — PostgreSQL как основная OLTP-база
- Для тяжёлой аналитики поверх PG ставят ClickHouse
- На собеседованиях аналитиков задачи по SQL подразумевают PostgreSQL-синтаксис
MySQL встречается:
- VK (исторически), Mail.ru Group, многие e-commerce проекты
- Legacy-проекты на PHP + MySQL (WordPress, 1C-Битрикс)
- Стартапы, использующие PlanetScale или AWS RDS MySQL
Тренд: новые проекты в России выбирают PostgreSQL. MySQL остаётся там, где исторически сложилось.
Какую СУБД учить аналитику
PostgreSQL — первым и основным. Вот почему:
- Собеседования — задачи по SQL на собеседованиях пишут под PostgreSQL. Оконные функции, CTE, DISTINCT ON — всё это PostgreSQL-синтаксис
- Стандарт SQL — PostgreSQL ближе к ANSI SQL, чем MySQL. Что выучите в PG — перенесётся в другие СУБД
- Аналитические возможности — FILTER, ARRAY, JSONB, полноценные CTE. В MySQL этого нет или оно ограничено
- Экосистема — ClickHouse, Greenplum, Redshift, BigQuery используют SQL-синтаксис, близкий к PostgreSQL
MySQL учить отдельно не нужно. Если на работе столкнётесь — 90% синтаксиса совпадает, а оставшиеся 10% загуглите за день.
А что с ClickHouse?
ClickHouse — это не замена PostgreSQL, а дополнение. PostgreSQL — OLTP-база для приложений и небольших аналитических запросов. ClickHouse — OLAP-база для агрегаций по миллиардам строк. Подробное сравнение — в статье ClickHouse vs PostgreSQL для аналитика.
Типичная связка в российской компании: приложение пишет в PostgreSQL, данные реплицируются в ClickHouse, аналитик строит дашборды и ad-hoc запросы в ClickHouse.
Вопросы с собеседований
В чём главное отличие PostgreSQL от MySQL для аналитика? — PostgreSQL полнее поддерживает оконные функции (FILTER, frame clause), CTE с INSERT/UPDATE, DISTINCT ON, ARRAY-тип и JSONB. MySQL догоняет, но всё ещё отстаёт в аналитических возможностях.
Что такое DISTINCT ON и есть ли он в MySQL? — DISTINCT ON (col) возвращает одну строку на каждое уникальное значение col. Это PostgreSQL-специфичная конструкция. В MySQL аналог — подзапрос с ROW_NUMBER() и фильтрацией по rn = 1.
Чем ILIKE отличается от LIKE? — ILIKE — регистронезависимый LIKE, есть только в PostgreSQL. В MySQL регистрозависимость LIKE зависит от collation таблицы — по умолчанию utf8_general_ci регистронезависим.
Когда MySQL лучше PostgreSQL? — для простых веб-приложений с высокой нагрузкой на чтение, где не нужны сложные аналитические запросы. MySQL проще в настройке репликации и исторически лучше интегрирован с PHP-экосистемой.
Можно ли на собеседовании писать MySQL-синтаксис? — лучше PostgreSQL. Если напишете CONCAT вместо
||— ничего страшного. Но DISTINCT ON, FILTER, ILIKE — это PostgreSQL, и их ожидают увидеть.
Потренируйтесь отвечать на вопросы по SQL для аналитика — откройте тренажёр с 200+ задачами и 1500+ примерами вопросов.
FAQ
Нужно ли аналитику учить MySQL?
Нет, специально учить не нужно. Если на работе используют MySQL — разберётесь за пару дней, потому что базовый SQL одинаков. На собеседованиях MySQL-синтаксис не спрашивают.
MariaDB — это MySQL?
MariaDB — форк MySQL, созданный после покупки MySQL компанией Oracle. Синтаксис почти идентичен MySQL, но MariaDB добавляет свои расширения (оконные функции появились раньше, чем в MySQL). Для аналитика разница несущественна.
Почему PostgreSQL бесплатный, если он такой мощный?
PostgreSQL — это проект с открытым исходным кодом, который развивается сообществом. Нет владельца, который может его «закрыть». Коммерческие компании зарабатывают на managed-версиях: Supabase, Neon, AWS RDS, Яндекс.Cloud Managed PostgreSQL.
Какую СУБД ставят в тестовых заданиях?
В 95% случаев — PostgreSQL. Если в задании не указана СУБД, пишите PostgreSQL-синтаксис. Если указан MySQL — отличия минимальны в рамках типичного тестового.
Прокачайте SQL для собеседований — SQL-тренажёр с задачами по PostgreSQL и подробный гайд для аналитика.