🐘 PostgreSQL vs MySQL 🐬
https://www.youtube.com/watch?v=mg70LYuRS3IСтатья на medium (с картинками)
Одна из луууучших лекций на тему сравнения PSQL и MYSQL, так еще и с конференции моих товарищей
Коротко:
- Функционально MySQL уже догнал PSQL
- PSQL на каждый connection открывает отдельный процесс, а MySQL отдельный тред, поэтому на PSQL надо использовать PgBouncer и/или PGPool-II для оптимизации работы с connection
- PSQL и MYSQL строят запросы примерно одинаково заисключением этапа Executor, где в MySQL процедуры передаются в движок, который вы используете для таблицы, а в PSQL движок всего один, что позволяет PSQL быть более оптимизированным (он конкретно знает как устроен его движок и обращается к нему напрямую)
– Статистика на PSQL знает гораздо больше о данных, которые в нем храняться (поскольку он может собирать ее напрямую из единственного движка), что в свою очередь дает возможность оптимизатору выстраивать запросы SELECT более оптимизировано
– PSQL и MySQL используют MVCC для работы с транзакциями.
PSQL при каждом изменении создает копию записи с указанием в каком id транзакции произошли изменения и помечает этим же id старую запись, (2) при удалении указывает транзакцию. Далее при процессе AutoVacuum он очистит все данные, который были удалены ранее самой старой активной транзакции.
MySQL же всегда держит 1 актуальную версию объекта, а в отдельном месте (undo_log) создает запись с тем, что было изменено (включая INSERT, UPDATE и DELETE).
Соответственно: UPDATE в PSQL потребует больше места на диске и дольше, а INSERT меньше и быстрее, также откат транзакций быстрее. Но в целом, MySQL быстрее в операциях INSERT, UPDATE и DELETE.
– Индексы бывают кластерные (храняться вместе с данными, сразу отсортированы по нему и может быть всего один) и некластерные (индексы храняться рядом)
В PSQL все индексы некластерные + PSQL поддерживает множество видов и типов индексов.
В MySQL есть кластерный индекс (PRIMARY KEY) + поддеживает только B+ Tree index.