В чем разница движков MySQL и PostgreSQL
Что проверяют
Знаете ли вы различия, которые реально влияют на проект, а не общие слова «PostgreSQL мощнее». Следом обычно спрашивают, что бы вы взяли для нового сервиса на Django или FastAPI и почему.
Как отвечать
Начните с устройства хранения, от него растёт остальное:
- движки: в MySQL подключаемые движки хранения, по умолчанию InnoDB с транзакциями и внешними ключами. В PostgreSQL движок один;
- MVCC: есть у обоих, но устроен по-разному. InnoDB держит старые версии в undo log, таблица кластеризована по первичному ключу. PostgreSQL пишет новую версию строки прямо в таблицу, поэтому ему нужен
VACUUM, а раздувание таблиц его типичная проблема; - изоляция по умолчанию:
REPEATABLE READв InnoDB иREAD COMMITTEDв PostgreSQL. Один и тот же код ведёт себя по-разному при конкурентных транзакциях; - DDL в транзакции: в PostgreSQL миграцию можно откатить целиком, в MySQL DDL делает неявный коммит, и упавшая на середине миграция Alembic оставит схему в промежуточном состоянии;
- типы и индексы: у PostgreSQL
JSONBс GIN-индексом, массивы, диапазоны, частичные индексы, GiST, BRIN, расширения PostGIS и pgvector. В MySQLJSONиндексируется через генерируемые колонки или функциональные индексы; - SQL: в PostgreSQL есть
RETURNINGиINSERT ... ON CONFLICT, в MySQLON DUPLICATE KEY UPDATE; - соединения: PostgreSQL заводит процесс на каждое подключение, при сотнях воркеров нужен PgBouncer.
Для Python назовите драйверы: psycopg и asyncpg против mysqlclient и PyMySQL.
Где спотыкаются
Говорят, что MySQL «не полностью ACID». InnoDB полноценно транзакционный, это утверждение осталось со времён MyISAM.
Приписывают MVCC только PostgreSQL. Многоверсионность есть и в InnoDB, различаются реализация и её последствия.
Отвечают «MySQL быстрее на простых запросах» без условий. Скорость зависит от схемы, индексов и нагрузки, без замеров на своих данных это пустое утверждение.