Главная > Программы > База данных MySQL vs PostgreSQLВыбор между MySQL и PostgreSQL - это решение, которое должен принять каждый разработчик веб-приложений, который выбирает между различными Open-Source СУБД. Оба решения проверены временем и оба заслуживают пристального внимания. СУБД MySQL задумывалась как более быстрая но менее функциональная, в то время как разработчики PostgreSQL сосредоточились на большем количестве функционально полезных примочек чтобы как можно ближе соотвтетствовать стандартам Oracle. MySQL очень популярен среди Web разработчиков по причине его высокой скорости и простоты использования. PosgreSQL менее популярен, так как удобен и просто только для тех разработчиков, которые ранее использовали Oracle или другие похожие базы данных. Но все скоростные характеристики MySQL по сравнению с PostgreSQL постепенно тают, так как с каждым обновлением PostgreSQL заметно прибавляет в скорости. Теперь рассмотрим эти две СУБД более пристально. АрхитектураPostgreSQL уникальная СУБД с единым сервером хранения данных (СХД). MySQL имеет два слоя в своей архитектуре. Первый слой - это набор серверов хранения данных. По этому при сравнении обычно указывают какой именно сервер хранения данных MySQL использовался. Каждый сервер отличают и параметры быстродейстсвия и его функциональные возможности. Самый распространенный из них - InnoDB. Он отличается от остальных полной поддержкой модели ACID и высокой производительностью. Прямым конкурентом InnoDB считается MyISAM, который годится для обработки и хранения сравнительно небольших объемов данных, которые приемущественно считываются из БД, а не записываются. А также когда не критично отсутствие ACID. Приложения, которые работают с MySQL, могут одновременно использовать несколько СХД для обеспечения наилучшего набора функциональности и производительности. ПроизводительностьПроизводительность СУБД может быть оптимизирована изходя из среды использования. Сравнения производительности разлчных СУБД также нужно проводить очень аккуратно и обращать внимание на цель исполльзования и конфигурацию в которой работает СУБД. И MySQL и PostgreSQL имеют множество рычагов, с помощью которых можно управлять производительностью. Ориентированность СУБДСтандартная конфигурация обоих СУБД оптимизирована для небольших систем, которые используются большинством потребителей этих СУБД. Если сравнивать производительность стандартных конфигураций, то отличия минимальны и невозможно выделить явного лидера. Скоростные характеристикиPostgreSQLPostgreSQL предоставляет функционал, который может увеличить производительность
для некоторых видов SQL запросов. Из этих функций стоит выделить:
Однако, Federated и Blackhole не являются серверами "хранения" данных (например, Blackhole ничего не хранит). InnoDB разработан сторонней компанией InnoBase, которая была основана компанией Oracle. InnoDB поддерживает транзакции и занимает лидирующее место из всех поставляемых с MySQL серверов хранения данных. MySQL планирует представить новые СХД Maria и Falcon в предстоящей версии 6.x. На них возложена задача заменить существующие движки MyISAM и InnoDB соответственно. Существуют и другие СХД, разработанные сторонними компаниями и группами разработчиков. Наиболее популярные из них:
MySQL MyISAM имеет примитивный кэш, который перед выполнением каждого запроса на выборку сверяет простым сравнением строку запроса с предыдущими выполненными запросами и если есть совпадение то выдает ранее выбранный результат. Данный подход годится для систем, где подавляющей операцией является считывание данных, потому как только любая из таблиц изменит свое состояние (INSERT, UPDATE, DELETE) весь кэш очищается и соответственно теряется преимущество в производительности. Кэшировщик запросов запускается в отдельном потоке и обрабатывает каждый входящий запрос на выборку, так что в конечном итоге данный подход может стать узким местом и довольно сильно сказаться на общей производительности СУБД. Разработчики предусмотрели выключение данной функции, так что волноваться по этому поводу не стоит. MySQL также поддерживает сетевой протокол сжатия данных, который включается и выключается на стороне клиента (если конечно позволяет сервер). Данная функция сжимает все данные которые идут от сервера к клиенту. MySQL:MyISAM MyISAM это традиционный СХД для MySQL и предлагает лучшее соотншение производительности и функциональности для баз данных предназначенных преимущественно для выборки данных (select). MySQL MyISAM обрабатывает запросы на выборку быстрее чем PostgreSQL, если речь идет о простых запросах. MyISAM не поддерживает транзакций и внешних ключей. MyISAM поддерживает лидирующий префикс сжатия для ключей и сжатых таблиц предназначенных только для чтения. Системный таблицы MySQL всегда используют СХД MyISAM. Это сделано для того, чтобы исключить даже потенциальную возможность потери данных. MySQL:InnoDB InnoDB это полнофункциональная ACID транзакционная система (сервер) хранения данных (СХД), которая использует технологию MVCC. Это хороший выбор для современных приложений MySQL. InnoDB хранит данные с первичным ключами, так что поиск по первичным ключам происходит очень быстро. Данный подход очень полезен для физической оптимизации БД. В случае когда он не пременим и дает низкую производительность, то явно его можно не использовать и тогда система создаст невидымый внутренний первичный ключ типа Integer(15) и будет проводить индексацию по нему. InnoDB автоматически создает хэш индексы когда обрабатывает запросы на выборку (SELECT). Эта функция может быть отключена при необходимости. Некоторые процессы работают быстрее без этой функции. InooDB имеет буфер вставки, который кэширует обновления вторичных индексов и фиксирует их в фоновом режиме. Данная функция фундаментально увеличивает производительность запросов на вставку данных. Чтобы умешить количество обращений к жесткому диску для записи новых данных их необходимо комбинировать в большие группы. Если InnoDB установлен как плагин к MySQL 5.1, он поддерживает сжатие таблиц налету. Вы можете использовать аттрибуты ROW_FORMAT=COMPRESSED или KEY_BLOCK_SIZE в запросах CREATE TABLE и ALTER TABLE, чтобы дать команду InnoDB сжать каждую страницу в 1K, 2K, 4K, 8K или 16K байт. Innobase Oy, это компания, которая занимается разработкой InnoDB. Она была куплена компанией Oracle в октябре 2005 года. С тех пор InnoDB все больше и больше заимствует у СУБД Oracle. А теперь, с покупкой компании MySQL компанией SUN эти и без того тесные взаимоотношения между Oracle и MySQL стали еще крепче. MySQL выходит на качественно новый уровень возможностей. MySQL:NDB Cluster NDB это высокопроизводительный преимущественно располагающися в Оперативной Памяти (RAM) СХД. Не индексируемые аттрибуты могут сохраняться на жестком диске. Данные и логи также переодически синхронизируются на жесткий диск, чтобы избежать потери данных в случае внезапного "падения" кластера. NDB преимущественно используется в сфере телекоммуникаций, где аптайм и производительность в реальном масштабе времени критичны. NDB прозрачно собирает данные в фрагменты которые регулярно доставляет во все участки кластера. NDB использует внутреннюю синхронную репликацию чтобы записи были распространенны по меньшей мере на двух участках кластера прежде чем совершать фиксацию на жесткий диск. NDB также поддерживает автоматическое восстановление "упавших" элементов кластера (нодов). Из слабых сторон NDB стоит отметить очень плохую поддержку сложных запросов с использованием операторов JOIN. В PostgreSQL похожих решений на данный момент просто нет. MySQL:Archive MySQL поддерживает сжатие на лету с версии 5.0, когда в дистрибутив попал СХД ARCHIVE. Archive - это СХД, который позволяет делать одновременно только 1 запись и множество чтений. Разработан специально для архивных баз данных, где запись в БД осуществляется гараздо реже и преимущественно одним источником данных. Сила сжатия достигает 90%. Archive не поддерживает индексы. В версии MySQL 5.1 Archive может работать с несколькими разделами (партициями). MySQL:Falcon Falcon это ACID транзакционный СХД, который был разработан самой MySQL. В данный момент он находится в зачаточном сотоянии и доступен для тестирования в бета-ветке MySQL 6.0. Falcon поддерживает сжатие данных налету. Данные, сохраненные в таблицах Falcon, сжимаются на жестком диске, но в оперативной памяти храняться не в сжатом ввиде. Сжатие происходит автоматически, когда данные синхронизируются на жесткий диск. MySQL:Maria Maria это ACID СХД, который был разработан Монти Вайденисом (Monty Widenius) и командой разработчиков MySQL. МультпроцессностьИсторически сложилось, что MySQL разрабатывалась и оптимизировалась под
однопроцессорные системы. PostgreSQL в этом смысле смотрится гараздо
симпотичнее. Чем больше ядер в системе, тем PostgreSQL работает
быстрее, чего о MySQL сказать трудно. Ассинхронный Ввод/ВыводPostgreSQL полностью поддерживает асинхронный API для использования в клиентских
приложениях. Данная возможность позволяет увеличить производительность
в некоторых случаях до 40%. В MySQL отсутствует поддержка ассинхронного
режима. Но существует несколько драйверов, которые предоставляют эту
возможность. Например MySQL драйверы для perl и ruby. Модель ACIDACID следует понимать как Atomicity, Consistency, Isolation и Durability
(Валентность, Последовательность, Изоляция и Длительность). Данная
модель используется для обеспечения целостности данных средствами СУБД.
Многие СУБД достигают соглашений ACID путем использования транзакций. Простота использованияГотча (Gotcha) - это функция или функции которые работают так как описаны но
не так как ожидалось (http://sql-info.de/mysql/gotchas.html).
Поклонники PostgreSQL настаивают на том, что MySQL имеет больше готчей
чем PostgreSQL. Insert Ignore / ReplaceMySQL поддерживает операторы 'INSERT IGNORE' и 'REPLACE' которые вставляют
запись если ее не существует и ничего не делают в другом случае или
заменяют текущую запись соответственно. ОграничителиОбе СУБД PostgreSQL и MySQL поддерживают ограничители Not-Null, Unique,
Primary Key и Foreign Key. Однако MySQL не поддерживает ограничение
Check когда PostgreSQL поддерживает его уже довольно продолжительное
время. Значения по умолчаниюPostgreSQL позволяет для колонок использовать в качестве значения по умолчанию любую функцию помеченную как IMMUTABLE или STABLE. В MySQL, на данный момент, лишь функция Now() может быть использована как значение по умолчанию для колонки. Сохраненные процедурыИ PostgreSQL и MySQL поддерживают сохраненные процедуры. ТриггерыИ PostgreSQL и MySQL поддерживают триггеры. Триггеры в PostgreSQL могут
выполнять любые пользовательские функции из любого процедурного языка
за исключением PL/pgsql. Репликация и Высокая ДоступностьРепликация - это механизм СУБД дублицировать свои данные для резервных копий а также для зеркалирования на другие сервера для обеспечения высокой стабильности. PostgreSQL и MySQL оба поддерживают репликации: PostgreSQLPostgreSQL поддерживает репликацию на уровне подключаемых модулей. Существует
несколько модулей, которые позволяют осуществлять репликацию данных
СУБД PostgreSQL: MySQLMySQL поставляется с поддержкой ассинхронной репликации данных. Начиная с
версии 5.1, MySQL поддерживает два формата репликации. SBR отслеживает
SQL запросы, которые вносят изменения в БД, в специальный бинарный
логфайл, на который подписаны все дочерние сервера. Соответственно при
изменениях в главной БД, все остальные БД получают копии данных. RBR
отслеживает инкрементальные изменения записей и записывает их в
бинарный логфайл, из которого получают данные все дочерние БД. RBR
используется автоматически, когда выполняется определенный запрос в
главной БД. Некоторые СХД как NDB, Falcon и в некоторых случаях InnoDB
для репликации используют только RBR. Типы данныхPostgreSQL не поддерживает unsigned integer, но имеет более широкую поддержку
типов данных в аспектах соотвтетствия стандартам, базовый логический
тип Boolean, определение пользовательских типов данных, встроенные типы
данных. ПодзапросыMySQL и PostgreSQL поддерживают подзапросы. В MySQL подзапросы появились недавно и требуют сильной доработки по части производительности. В PostgreSQL подзапросы доведены практически до совершенства. Расширенное индексированиеРасширенное индексирование позволяет СУБД выполнять запросы с гараздо более высокой скоростью. И MySQL и PostgreSQL поддерживают расширенное индексирование. Множественные индексы.MySQL поддерживает множественные индексы для каждой таблицы в отдельности и может использовать один индекс для одной таблицы. PostgreSQL поддерживает множественнные индексы для каждого запроса в отдельности. Полнотекстовые индексы.MySQL идет с поддержкой полнотекстового поиска, но поиск может быть
использован только на СХД MyISAM. Также MySQL поддерживает внешние
модули для организации полнотекстового поиска - Sphinx Fulltext Search
Engine. Данный плагин добавляет поддержку полнотекстового поиска для
СХД InnoDB. Частичное индексированиеMySQL не поддерживает частичного индексирования. PostgreSQL поддерживает
частичное индексирование. Частичный индекс - это индекс построенный на
срезе таблицы. Срез определяется специальным выражением, которое
называется предикатом частичного индекса. Индекс содержит записи,
которые удовлитворяют предикату. Частичные индексы - это довольно
специфичная штука, но существуют ситуации, в которых частичные индексы
могут быть очень полезны. ПорционированиеMySQL поддерживает несколько форм горизонтального порционирования: ЛицензированиеPostgreSQL распространяется по лицензии BSD, в которой отмечены пункты Free
Software Definition и Open Source Definition и стандарт Copyfree. РазработкаMySQL владеет и спонсирует одна профилирующая компания MySQL AB. Правда
теперь она является частью Sun Microsystems, которая в свою очередь
была приобретена компанией Oracle. MySQL AB держит копирайты и
исходники MySQL. Происхождение названияКогда был создан стандарт ANSI SQL, его автор сказал, что официально SQL
произносится как "ess queue ell". Имена и MySQL и PostgreSQL отражают в
своих именах этот стандарт. MySQL официально произносится как "my ess
queue ell". Однако многие произносят MySQL как "my sequel". ПопулярностьMySQL широко известнет и применяется в большинстве открытых (open-source)
разработок по всему миру. Наиболее часто используется СХД MyISAM. И с
уверенностью можно сказать, что MySQL самая популярная СУБД для
вебразработок по всему миру. Главная > Программы > База данных |