Хорошо, позвольте мне рассказать вам, что побуждает меня написать эту статью. Когда мне дали первое задание в офисе, оно касалось продукта, в котором использовался PostgreSQL, и я понятия не имел, почему он используется, когда большинство других продуктов использовали MySQL. В поисках ответа на свое любопытство я поспрашивал только для того, чтобы понять, что большинство людей были в одной лодке со мной. Эта статья предназначена для тех, кто, как и я, ищет ответы на этот вопрос.

Давайте обсудим различия между PostgreSQL и MySQL, которые, надеюсь, помогут нам понять, когда использовать PostgreSQL, а когда использовать MySQL для всех требований к базе данных.

Соответствие ACID (атомарность, согласованность, изоляция, долговечность)? Соответствие ACID гарантирует, что база данных работает нормально и без сбоев даже во время сбоев и нескольких операций в течение одной транзакции. PostgreSQL совместим с ACID, тогда как стандартный обработчик таблиц MySQL не поддерживает согласованность, изоляцию или надежность. Он поддерживает атомарность с использованием блокировок таблиц. MySQL совместим с ACID только при использовании механизмов InnoDB и NDB Cluster Storage.

Соответствие SQL? Соблюдение правил стандартного языка запросов очень важно, когда кто-то хочет работать с гетерогенными базами данных и перемещать данные из одной базы данных в другую. PostgreSQL в значительной степени совместим с SQL. Согласно документации:

PostgreSQL поддерживает большинство основных функций SQL: 2011. Из 179 обязательных функций, необходимых для полного соответствия Core, PostgreSQL соответствует как минимум 160. Кроме того, существует длинный список поддерживаемых дополнительных функций. Возможно, стоит отметить, что на момент написания ни одна текущая версия какой-либо системы управления базами данных не заявляла о полном соответствии Core SQL: 2011.

С другой стороны, MySQL соответствует требованиям лишь частично. Согласно документации:

Одна из наших основных целей при разработке продукта - продолжить работу в направлении соответствия стандарту SQL, не жертвуя при этом скоростью или надежностью. Мы не боимся добавлять расширения к SQL или поддержку функций, отличных от SQL, если это значительно увеличивает удобство использования MySQL Server для большого сегмента нашей пользовательской базы.

Контроль параллелизма? PostgreSQL обеспечивает очень высокий уровень параллелизма с помощью своей реализации MVCC, в то время как MySQL поддерживает MVCC только в InnoDB. Для тех, кому интересно, что такое MVCC, согласно Википедии:

Управление многоверсионным параллелизмом (MCC или MVCC) - это метод управления параллелизмом, обычно используемый системами управления базами данных для обеспечения одновременного доступа к базе данных и в языках программирования для реализации транзакционной памяти.

Частичные индексы? С частичными индексами можно указать, какие строки должны быть проиндексированы, в отличие от обычных индексов, которые работают только со столбцами. Частичные индексы очень полезны в случаях, когда таблица запрашивается с использованием предложения where с константой. Например, рассмотрим запрос:

select column1 from table_name where column2='constant' and column3='variable';

Этот запрос можно оптимизировать, используя индекс из 2 столбцов:

create index index_1 on table_name (column2, column3);

Проблема с вышеупомянутым подходом заключается в том, что он включает строки, которые никогда не запрашиваются, т.е. где column2!='constant' С частичными индексами мы можем индексировать только те строки, которые запрашиваются.

create index index_1 on table_name(column3) where column2='constant';

PostgreSQL поддерживает частичные индексы, а MySQL - нет.

Функции NoSQL и поддержка JSON? PostgreSQL поддерживает функции NoSQL, такие как встроенная поддержка XML и пары ключ-значение с HSTORE, а также поддерживает JSON и индексацию на JSON для более быстрого доступа. MySQL поддерживает только тип данных JSON, но не поддерживает индексацию JSON.

Материализованные представления? Его можно рассматривать как «кеш» для баз данных. Это объект базы данных, содержащий результаты запроса, которые при необходимости могут быть обновлены из исходной базовой таблицы. PostgreSQL поддерживает материализованные представления, в то время как в MySQL эта функция отсутствует.

create materialized view table_name
    [ (column_name [, ...] ) ]
    [ with ( storage_parameter [= value] [, ... ] ) ]
    [ tablespace tablespace_name ]
    AS query
    [ with [no] data ]

Я надеюсь, что это хорошее начало для понимания различий между PostgreSQL и MySQL. Выбор между двумя базами данных определенно зависит от требований, для которых она будет использоваться.

После этой статьи я не совсем понимаю PostgreSQL, и я надеюсь, что вы тоже! 2-й квадрант PostgreSQL, PostgreSQL Tutorial, Webtechniques заслуживают моего упоминания за то, что помогли мне лучше понять PostgreSQL.

Ваш отзыв очень ценен. Если у вас есть какие-либо вопросы относительно этого блога, пожалуйста, свяжитесь со мной по адресу [email protected]. Мы высоко ценим ваши усилия. Не забудьте выразить признательность, если вам понравился блог. Спасибо!