PostgreSQL и MySQL — одни из самых популярных реляционных систем управления базами данных (РСУБД). В статье рассмотрим функциональные различия между ними и сравним их производительность, чтобы вы смогли выбрать подходящую СУБД для своего бизнеса.
Несмотря на сближение функциональных возможностей Postgres и MySQL, различия между ними остаются. Например, Postgres лучше подходит для управления крупными и сложными базами данных (БД), а MySQL оптимальна для БД сайтов и онлайн-приложений, поскольку ориентирована на скорость работы. Это вытекает из устройства этих РСУБД, которое мы и рассмотрим.
Как и любые другие реляционные СУБД, эти системы хранят данные в таблицах, однако в MySQL для этого используется несколько движков, в то время как PostgreSQL использует только Storage Engine. С одной стороны, это делает Postgres более удобной, поскольку движки в MySQL по-разному считывают данные и записывают их на диск. С другой, MySQL предлагает больше гибкости в выборе движка для работы с данными. Однако плюс PostgreSQL в том, что в Storage Engine реализована функция наследования таблиц, которые представлены здесь как объекты. Поэтому действия с ними производятся при помощи объектно-ориентированных функций.
Стандарту SQL уже более 35 лет, при этом только разработчики Postgres стараются привести свой продукт к полному соответствию стандарту. Разработчики MySQL используют иной подход к SQL: если какая-то функция позволяет упростить работу с системой, она будет реализована даже при несоответствии этой реализации стандарту. Это делает MySQL более дружественной к пользователю в сравнении с PostgreSQL.
Если говорить про поддержку со стороны сообщества, то число разработчиков MySQL, конечно, пока еще превосходит тех, кто работает с Постгрес, однако получить квалифицированную помощь можно в обоих сообществах. Кроме того, по PostgreSQL написано много бесплатных руководств и даже книг, в которых содержатся ответы на большинство вопросов. Добавим, что обе платформы бесплатные, однако у MySQL существует несколько коммерческих версий, что в ряде случаев может приводить к дополнительным тратам.
Обе системы поддерживают большое количество языков программирования: из популярных отметим C++, Java, Python, lua, PHP, поэтому у сотрудников из отдела разработки компании не будет проблем с внедрением функций любой из этих систем.
MySQL более универсальная система, которая работает в среде Windows, Linux, MacOS и в ряде других операционных систем. Postgres изначально «заточен» под Linux, однако с помощью интерфейса REST API становится таким же универсальным решением, которое работает под любой ОС.
Возможностей для обработки данных больше у Postgres. Например, чтобы перемещаться по данным таблиц, используется курсор, при этом ответы записываются в память сервера БД, а не в память клиента, как это реализовано в MySQL. Также PostgreSQL позволяет строить индексы одновременно для нескольких столбцов. При этом поддерживаются разные индексы, позволяющие работать с несколькими типами данных. Еще эта СУБД предлагает использование регулярных выражений в запросах. Однако новые поля в Postgres добавляются только в конце таблиц.
Параллельная обработка данных лучше организована в PostgreSQL, поскольку эта платформа имеет встроенную реализацию MVCC (многоверсионный параллельный доступ). MVCC также может поддерживаться и в MySQL, но это возможно только при условии поддержки со стороны InnoDB. А относительно репликации отметим, что Постгрес поддерживает логическую, потоковую и двунаправленную, а MySQL — круговую, а также master-master и master-standby. Под репликацией мы понимаем копирование данных между БД, расположенными на разных серверах.
Проведение тестов будет честным, если сравнивать две чистых системы, то есть решения «из коробки». Тестирование с индексом дает следующие результаты:
Что касается обновления в БД, то здесь Postgres демонстрирует постепенный рост по мере увеличения количества записей, а вот MySQL обрабатывает их за примерно одно и то же время, начиная со 100 тыс. записей. Это связано с разной реализацией хранения данных. Тем не менее преимущество у PostgreSQL даже на больших объемах данных существенное: 3,5 против 9,5 сек. на 400 тыс. записей, то есть более чем в 2,7 раза.
При отмене индексов PostgreSQL также выдает на удивление высокую производительность, обрабатывая БД на 400 тыс. записей за 1,3, 0,7 и 2,2 сек. при внутреннем объединении, выборке и обновлении соответственно.
Таким образом, производительность Postgres оказывается выше в среднем в 2 раза (2,06). При этом изначально MySQL позиционировалась как платформа с улучшенной производительностью, однако постоянная оптимизация со стороны разработчиков PostgreSQL сделали их продукт более производительным.
Рассмотрим только уникальные функции, которые характерны для конкретной платформы. Поэтому, например, мы не будем касаться здесь поддержки MVCC или ACID, поскольку эти функции есть у обеих систем.
С точки зрения разработчика MySQL хороша тем, что:
С точки зрения разработчика PostgreSQL хороша тем, что:
Для наглядности представим главные особенности обеих систем в виде таблицы:
PostgreSQL |
MySQL |
|
Соответствие стандарту SQL |
почти полное |
частичная совместимость |
Поддерживаемые ОС |
Solaris, Windows, Linux, OS X, Unix, Hp-UX |
Solaris, Windows, Linux, OS X, FreeBSD |
Применение |
Массивные базы данных со сложными запросами (например, Big Data) |
Более легкие базы данных (например, веб-сайтов и приложений) |
Типы данных |
Поддерживает расширенные типы данных, включая массивы, hstore |
Поддерживает стандартные типы данных SQL |
Наследование таблиц |
Да |
Нет |
Триггеры |
Поддерживает триггеры по большому количеству команд |
Ограниченная поддержка триггеров по командам |
Движки для хранения данных |
Один (Storage Engine) |
Разные |
Как видим, ряд функций реализован только в Postgres. Обе системы поддерживают ODBC, JDBC, CTE (обобщенные табличные выражения), декларативное секционирование, GIS, SRS, оконные и ряд других функций.
У обеих систем есть свои преимущества. MySQL справляется с задачами горизонтального масштабирования, ее проще настраивать и управлять ей, но если планируется расширение БД, а также работа с разными типами данных, лучше заранее подумать о внедрении Postgres. Кроме того, PostgreSQL — на 100% бесплатное решение, поэтому компании с ограниченным бюджетом могут использовать его, не опасаясь лишних трат.
Параллельная обработка данных лучше организована в PostgreSQL, поскольку эта платформа имеет встроенную реализацию MVCC (многоверсионный параллельный доступ). MVCC также может поддерживаться и в MySQL, но это возможно только при условии поддержки со стороны InnoDB
А когда InnoDB не поддерживал MVCC? И еще про встроенную реализации MVCC в PostgreSQL: https://www.cs.cmu.edu/~pavlo/blog/2023/04/the-part-of-postgresql-we-hate-the-most.html Мягко говоря - реализация не самая удачная
А можно как-то узнать дизайн теста, который проводился?
Возможно, для полных профанов статья и может быть сколько-то полезной, но даже для них не стоит писать откровенную ерунду. Не знаю, где автор нашел те цифры, показывающие разгромное преимущество производительности Постгрес, лично мне попадались только результаты бенчмарков, которые явного лидера совершенно не выявляли. Также полнейший бред представляет собой таблица сравнения: в MySQL есть и хранимые процедуры, и триггеры, и представления, и union... У меня чуть глаза на лоб не вылезли, когда я вот это вот всё читал. Придраться можно практически к каждому абзацу. Кошмар непрофессиональный, а не статья.
Если автор хотел показать преимущества Постгрес, за счет которых он сейчас действительно используется активно, то стоило подчеркнуть не сравнимо более мощную поддержку серверной логики. В MySQL хотя и есть хранимые процедуры и триггеры, но реализованы они достаточно ограничено. Тогда как в Посгрес, помимо встроенного языка PgSQL, можно использовать ещё и сторонние диалекты типа Python и т.п.
Игорь, добрый день! Благодарим вас за комментарий. Мы посмотрели описания свежих версий MySQL и Postgres — и да, действительно, там добавились новые возможности. Мы скорректировали таблицу по вашим замечаниям.
По поводу производительности Postgres: приведенные в статье цифры — это результаты тестирования коробочных решений. Схожие результаты можно найти в открытом доступе. Например, тут. При обработке больших данных Postgres всегда работает быстрее. Но возможно, у самых свежих версий MySQL 8.0.32 и PostgreSQL 15.1.1 показатели будут иными. Если поделитесь результатами, мы с радостью добавим их в статью.
Кстати, видим, что вы отлично разбираетесь в теме. Как смотрите на то, чтобы внести вклад в развитие нашего контентного раздела — написать инструкцию или статью на интересные вам и нам темы? Разумеется, за вознаграждение.
Если интересно: напишите, пожалуйста, нам на емейл content@timeweb.cloud. Готовы обсудить с вами темы статей и условия сотрудничества.
максимальный бред
Будем рады услышать почему у вас сложилось такое мнение и с какими выводами в статье вы не согласны