MySQL: отличия между MyISAM и InnoDB
Самые популярные типы хранение в базе MySQL – это MyISAM и InnoDB.
Неправильный выбор типа хранения приводит к тем же последствиям, что и неправильная структура таблиц, неправильные индексы и неправильные запросы. Другими словами – к падению производительности.
MyISAM
Интересен тем, что дает просто безумную скорость на select-ах и insert-ах. С другой стороны, он не поддерживает транзакционность и блокировку на уровне строк, что в свою очередь приводит к страшным тормозам при использовании deleteupdate. Проще говоря, на таблицу допускается только одна одновременная delete или update операция, и остальные вынуждены ждать завершения текущей операции, что на больших объемах данных приводит к серьезным проблемам.
К преимуществам движка можно отнести поддержку полнотекстовый поиск, компрессию и GIS функции. Под хранение каждой таблицы отводятся два файла – имя_таблицы.MYD ( данные ) и имя_таблицы.MYI ( индексы ). Формат данных платформенно независимый, что позволяет переносить данные с сервера на сервер простым копированием таблиц – это еще один плюс.
InnoDB
Был спроектирован для обработки транзакций, в частности для большого количества короткоживущих транзакций, которые чаще комитятся чем откатываются. Это не единственный движок, поддерживающий транзакционность, но на сегодня он является самым популярным для этой цели.
Кроме транзакционности, к преимуществам этого движка можно отнести row-level блокировки, правда тут стоит учесть тот факт, что table-level блокировки тоже имеют место быть, например при использовании автоинкрементных полей. С этим борятся и время от времени выходят фиксы, уменьшающие количество table-level блокировок, но никто не отменял регулярный просмотр логов на предмет проблем с блокировками.
Таблицы по умолчанию хранятся в одном innodb файле, но при желании их можно разместить в разных файлах, причем по одному на таблицу, если указать это явно.
Что может повлиять на выбор тиха хранения данных? Ну во-первых необходимость транзакционности, ибо если пишется серьезный финансовый софт, например тот же биллинг или процессинг, то тут майсам использовать никак нельзя.
Кроме того, специфика работы с данными, накладывает свой отпечаток на выбор движка. Если речь идет о какой-то статистике, которую все просто напросто просматривают, то лучше майсам с этим никто не справится.
Про конкурентность забывать тоже не стоит. Если работа с данными идет всего в несколько потоков, то это вполне может нивелировать недостатки myisam в плане updatedelete в пользу быстрых select.
При выборе движка есть еще ряд нюансов, которые не так важны как главные критерии, но которые тоже стоит учитывать.
Описание | MyISAM | InnoDB |
Транзакционный движек?Транзакция (Transaction) — блок операторов SQL , который в случае ошибки в одном запросе, возвращается к предыдущему состоянию (Rollback), и только в случае выполнения всех запросов подтверждается (Commit) | Нет | Да |
Поддержка внешних ключейВнешние ключи — это способ связать записи в двух таблицах по определенным полям так, что при обновлении поля в родительской автоматически происходит определенное изменение поля в дочерней (дочернюю и родительскую выбираешь при создании ключа; точнее, создаешь ключ в дочерней, который ссылается на родительскую). | Нет | Да |
Блокировка.Блокировка на уровне строк, т.е. если процессу нужно обновить строку в таблице, то он блокирует только эту строку, позволяя другим обновлять другие строки параллельно | Блокировка на уровне таблиц | Блокировка на уровне строк |
Одновременные запросы к разным частям таблицы. | Медленнее | Быстрее |
При смешанной нагрузке в таблице (select/update/delete/insert) | Медленнее | Быстрее |
Операция Insert | Быстрее | Медленнее, ибо есть оверхед на транзакцию, но это цена надежности |
Если преобладают операции чтения (SELECT) | Работает быстрее | Работает медленнее |
DeadlockDeadlock — ситуация в многозадачной среде или СУБД, при которой несколько процессов находятся в состоянии бесконечного ожидания ресурсов, захваченных самими этими процессами. | Не возникают | Возможны. |
Поддержка полнотекстового поиска | Да | Нет (доступен начиная с версии MySQL 5.6.4) |
Запрос Count(*) | Быстрее | Медленнее |
Поддержка mysqlhotcopyУтилита mysqlhotcopy представляет собой Perl-сценарий, использующий SQL-команды LOCK TABLES, FLUSH TABLES и Unix-утилиты cp или scp для быстрого получения резервной копии базы данных. | Да | Нет |
Файловое хранение таблиц | Каждой таблице отдельный файл | Данные при настройках по умолчанию хранятся в больших совместно используемых файлах |
Бинарное копировании таблиц?Табличные файлы можно перемещать между компьютерами разных архитектур и разными операционными системами без всякого преобразования. | Да | Нет |
Размер таблиц в БД | Меньше | Больше |
Поведение в случае сбоя | Крашится вся таблица | По логам можно все восстановить |
В случае хранения «логов» и подобного | Лучше | Хуже |
Выводы:
- Использовать MyISAM лучше в таблицах, которых преобладает один вид доступа: чтение (новостной сайт) или запись (например, логирование) ;
- Использование InnoDB имеет смысл во всех остальных случаях и случаях повышенных требований по сохранности данных.
- Многие жалуются на частые поломки MyISAM. Лично мне ни разу не доводилось с этим сталкиваться, потому ничего не могу сказать по этому поводу. Но надежность данных – это еще один аргумент в пользу innodb, который и крешит реже и восстанавливается быстрее.
- Каждый движок требует свой “кусок пирога”. Мало перекинуть данные в myisam – нужно чтобы сервер был сконфигурирован так, чтобы этому движку было выделено достаточно ресурсов, иначе поимеем те же самые тормоза. Впрочем, сводных данных для отчетов по статистике не обязательно будет много!
- Если данных немного, например той же статистики, то можно использовать тот же движок что и вся остальная база. По крайней мере лишите себя гемора поддержки двух движков.
PostgreSQL vs MySQL / Mail.ru Group corporate blog / Habr
В преддверии своего доклада на конференции PGCONF.RUSSIA 2015 я поделюсь некоторыми наблюдениями о важных различиях между СУБД MySQL и PostgreSQL. Этот материал будет полезен всем тем, кого уже не устраивают возможности и особенности MySQL, а также тем, кто делает первые шаги в Postgres. Конечно, не стоит рассматривать этот пост как исчерпывающий список различий, но для принятия решения в пользу той или иной СУБД его будет вполне достаточно.
Тема моего доклада «Асинхронная репликация без цензуры, или почему PostgreSQL завоюет мир», и репликация одна из самых больных тем для нагруженных проектов использующих MySQL. Проблем много — корректность работы, стабильность работы, производительность — и на первый взгляд они выглядят несвязанными. Если же посмотреть в историческом контексте, то мы получаем интересный вывод: MySQL репликация имеет столько проблем потому, что она не была продумана, а точкой невозврата была поддержка storage engine (подключаемых движков) без ответов на вопросы «как быть с журналом?» и «как различным storage engine участвовать в репликации». В 2004 году в PostgreSQL рассылке пользователь пытался «найти» storage engine в исходном коде PostgreSQL и сильно удивился, что их нет. В процессе дискуссии кто-то предложил добавить эту возможность PostgreSQL, и один из разработчиков ответил «Ребята, если мы так сделаем, у нас будут проблемы с репликацией и с транзакциями между движками».
ссылка на это письмо в postgresql mailing listThe problem is that many storage management systems… often do their own WAL and PITR. Some do their own buffer management, locking and replication/load management too. So, as you say, its hard say where an interface should be
abstracted.
Прошло более 10 лет, и что мы видим? В MySQL есть раздражающие проблемы с транзакциями между таблицами разных storage engine и у MySQL проблемы с репликацией. За эти десять лет у PostgreSQL появились подключаемые типы данных и индексы, а также есть репликация — т. е. преимущество MySQL было нивелировано, в то время как архитектурные проблемы MySQL остались и мешают жить. В MySQL 5.7 попытались решить проблему производительности репликации, распараллелив её. Поскольку проект на работе очень чувствителен к производительности репликации в силу своего масштаба, я попытался протестировать, стало ли лучше. Я нашёл, что параллельная репликация в 5.7 работает медленней однопоточной в 5.5, и лишь в отдельных случаях — примерно также. Если вы сейчас используете MySQL 5.5 и хотите перейти на более свежую версию, то учтите, что для высоконагруженных проектов миграция невозможна, поскольку репликация просто перестанет успевать выполняться.
После доклада на highload, в Oracle приняли к сведению разработанный мной тест и сообщили, что попытаются исправить проблему; недавно мне даже написали, что смогли увидеть параллелизм на своих тестах, и выслали настройки. Если не ошибаюсь, при 16 потоках появилось незначительное ускорение по сравнению с однопоточной версией. К сожалению, до сих пор не повторил свои тесты на предоставленных настройках — в частности потому, что с такими результатами наши проблемы всё равно остаются актуальными.
Точные причины такой регрессии производительности неизвестны. Было несколько предположений — например, Кристиан Нельсен, один из разработчиков MariaDB, у себя в блоге писал о том, что могут быть проблемы с перфоманс-схемой, с синхронизацией тредов. Из-за этого наблюдается регрессия в 40%, которая видна на обычных тестах. Oracle-разработчики это опровергают, и меня даже убедили, что её нет, видимо, я вижу какую-то другую проблему (и сколько же их всего?).
В MySQL репликации проблемы со storage engine усугубляются выбранным уровнем репликации — они логические, в то время как в PostgreSQL — физические. В принципе, у логической репликации есть свои преимущества, она позволяет сделать больше всяких интересных штук, об этом в докладе я тоже упомяну. Но PostgreSQL даже в рамках своей физической репликации уже сводит все эти преимущества на нет. Иными словами, почти все, что есть в MySQL, уже можно сделать и в PostgreSQL (либо будет можно в ближайшем будущем).
На реализацию низкоуровневой физической репликации в MySQL можно не надеяться. Проблема в том, что там вместо одного журнала (как в PostgreSQL) их получается два или четыре — смотря как посчитать. PostgreSQL просто коммитит запросы, они попадают в журнал, и этот журнал используется в репликации. PostgreSQL-репликация суперстабильна, потому что она использует тот же журнал, что и при операциях восстановления после сбоев. Этот механизм давно написан, хорошо оттестирован и оптимизирован.
В MySQL ситуация другая. У нас есть отдельный журнал InnoDB и журнал репликации, и нужно коммитить и туда, и туда. А это two-phase commit между журналами, который по определению работает медленно. То есть мы не можем просто взять и сказать, что мы повторяем транзакцию из InnoDB-журнала — приходится разбираться, что за запрос, запускать его заново. Если даже это логическая репликация, на уровне строчек, то эти строчки нужно искать в индексе. И мало того, что приходится сделать большое количество работы, чтобы выполнить запрос — он при этом снова будет писаться в свой InnoDB-журнал уже на реплике, что для производительности явно нехорошо.
В PostgreSQL в этом смысле архитектура на порядок продуманней и лучше реализована. Недавно в нём анонсировали возможность под названием Logical Decoding — которая позволяет сделать всякие интересные штуки, которые очень тяжело сделать в рамках физического журнала. В PostgreSQL это надстройка сверху, logical decoding позволяет работать с физическим журналом так, будто он логический. Именно эта функциональность скоро уберёт все преимущества MySQL репликации, кроме, возможно, размера журнала — statement-based репликация MySQL будет выигрывать — но у statement-based репликации MySQL есть совершенно дикие проблемы в самых неожиданных местах, и не стоит считать её хорошим решением (про это всё я тоже буду говорить в докладе).
Кроме того, для PostgreSQL есть триггерная репликация — это Tungsten, который позволяет делать то же самое. Триггерная репликация работает следующим образом: ставятся триггеры, они заполняют таблицы или пишут файлы, результат отправляется на реплику и там применяется. Именно через Tungsten, насколько я знаю, делают миграцию из MySQL в PostgreSQL и наоборот. В MySQL же логическая репликация работает прямо на уровне движка, и другой ее сделать сейчас уже нельзя.
У PostgreSQL документация гораздо лучше. В MySQL она формально вроде даже есть, но смысл отдельных опций понять бывает тяжело. Вроде написано, что они делают, но чтобы понять, как их правильно настраивать, нужно использовать неофициальную документацию, искать статьи на эти тему. Часто нужно понимать архитектуру MySQL, без этого понимания настройки выглядят какой-то магией.
Например, так «выстрелила» компания Percona: они вели MySQL Performance Blog, и в этом блоге было множество статей, в которых рассматривались отдельные моменты эксплуатации MySQL. Это принесло бешеную популярность, привело клиентов в консалтинг, позволило привлечь ресурсы для запуска разработки собственного форка Percona-Server. Существование и востребованность MySQL Performance Blog доказывают, что официальной документации просто недостаточно.
У PostgreSQL фактически все ответы есть в документации. С другой стороны, я слышал много критики при сравнении документации PostgreSQL со «взрослой» Oracle. Но это, на самом деле, очень важный показатель. MySQL с взрослым Oracle никто не пытается сравнивать вообще — это было бы смешно и нелепо — а PostgreSQL уже начинают сравнивать вполне серьезно, PostgreSQL-коммьюнити эту критику слышит и работает над улучшением продукта. Это говорит о том, что он по своим возможностям и производительности начинает конкурировать со столь мощной системой как Oracle, на которой работают мобильные операторы и банки, в то время как MySQL остаётся сидеть в нише веб-сайтов. И проекты-гиганты, доросшие до большого количества данных и пользователей, хлебают горе с MySQL большой ложкой, постоянно упираясь в его ограничения и архитектурные проблемы, которые невозможно исправить, затратив разумное количество сил и времени.
Примером таких крупных проектов на PostgreSQL является 1C: PostgreSQL идёт как опция вместо Microsoft SQL, а Microsoft SQL действительно фантастическая СУБД, одна из самых мощных. PostgreSQL может заместить MS SQL, а попытка заместить его MySQL… давайте опустим завесу жалости над этой сценой, как писал Марк Твен.
PostgreSQL соответствует стандартам SQL-92, SQL-98, SQL-2003 (реализованы все его разумные части) и уже работает над SQL-2011. Это очень круто. Для сравнения, MySQL не поддерживает даже SQL-92. Кто-то скажет, что в MySQL такая цель просто не ставилась разработчиками. Но нужно понимать, что разница между версиями стандарта заключается не в мелких изменениях — это новые функциональные возможности. То есть в тот момент, когда MySQL говорил: «Мы не будем следовать стандарту», они не просто вносили какие-то мелкие различия, из-за которых MySQL тяжело поддержать, они еще закрывали дорогу к реализации многих нужных и важных возможностей. Там до сих пор нет нормально оптимизатора. То, что там называется оптимизацией, в PostgreSQL называется «парсер» плюс нормализации. В MySQL это лишь план выполнения запросов, без разделения. И MySQL к поддержке стандартов придут еще очень нескоро, поскольку на них давит груз обратной совместимости. Да, они хотят, но лет через пять, может, что-нибудь у них появится. В PostgreSQL есть уже все и сейчас.
У MySQL есть проблема со сложными запросами. Например, MySQL не умеет спускать группировку в отдельные части union all. Разница между двумя запросами — на нашем примере группировка по отдельным таблицам и union all сверху работала в 15 раз быстрее, чем union all и потом группировка, хотя оптимизатор должен оба запроса приводить в одинаковый, эффективный план выполнения запроса. Нам придется делать генерацию таких запросов руками — т. е. тратить время разработчиков на то, что должна делать база.
«Простота» MySQL вытекает, как можно увидеть выше, из крайне бедных возможностей — MySQL работает просто хуже и требует больше времени и усилий во время разработки. В противоположность этому, у PostrgreSQL есть гистограммы и нормальный оптимизатор, и он выполнит такие запросы эффективно. Но если есть гистограммы, значит, есть их настройки — как минимум bucket size. Про настройки нужно знать и в отдельных случаях их менять — следовательно, нужно понимать, что это за настройка, за что она отвечает, уметь распознавать такие ситуации, увидеть выбрать оптимальные параметры.
Изредка случается, что умелость PostrgreSQL может помешать, а не помочь. В 95% случаев все хорошо работает — лучше, чем MySQL, — а какой-то один дурацкий запрос работает гораздо медленнее. Или всё работает хорошо, а потом внезапно (с точки зрения пользователя) по мере роста проекта некоторые запросы стали работать плохо (стало больше данных, стал выбираться другой план выполнения запроса). Скорее всего, для исправления достаточно запустить analyze или немножко покрутить настройки. Но нужно знать, что делать и как это делать. Как минимум, нужно прочитать документацию PostgreSQL на эту тему, а читать документацию почему-то не любят. Может потому, что в MySQL от неё мало помощи? 🙂
Подчеркну, что PostgreSQL в этом смысле не хуже, просто он позволяет отложить проблемы, а MySQL сразу их вываливает и приходится тратить время и деньги на их решение. В этом смысле MySQL работает всегда стабильно плохо, и еще на этапе разработки люди эти особенности учитывают: делают все максимально простым способом. Это относится только к производительности, точнее, к способам её достижения и к её прогнозируемости. В плане корректности и удобства PostgreSQL на голову выше MySQL.
Чтобы определиться с выбором между MySQL и PostgreSQL для конкретного проекта, прежде всего нужно ответить на другие вопросы.
Во-первых, какой опыт есть у команды? Если вся команда имеет 10 лет опыта работы с MySQL и нужно запуститься как можно быстрее, то не факт, что стоит менять знакомый инструмент на незнакомый. Но если сроки не критичны, то стоит попробовать PostgreSQL.
Во-вторых, нужно не забывать про проблемы эксплуатации. Если у вас не высоконагруженный проект, то с точки зрения производительности разницы между этими двумя СУБД нет. Зато у PostgreSQL есть другое важное преимущество: он более строгий, делает больше проверок за вас, дает меньше возможности ошибиться, и это в перспективе огромное преимущество. Например, в MySQL приходится писать собственные инструменты для верификации обычной ссылочной целостности базы. И даже с этим могут быть проблемы. В этом смысле PostgreSQL инструмент более мощный, более гибкий, разрабатывать на нем приятнее. Но это во многом зависит от опыта разработчика.
Подводя итог: если у вас простенький интернет-магазин, нет денег на админа, нет серьезных амбиций перерасти в большой проект и есть опыт работы с MySQL — то берите MySQL. Если предполагаете, что проект будет популярным, если он большой, его будет тяжело переписать, если в нём сложная логика и связи между таблицами — возьмите PostgreSQL. Даже из коробки он у вас будет работать, поможет в разработке, сэкономит время, и вам проще будет расти.
Разница между SQL и NoSQL: MySQL и MongoDB
Основные различия
Язык
Представьте себе город (назовем его А), в котором все говорят на одном языке. На нем строятся все бизнес-процессы, этот язык используется во всех формах общения. Словом, жители этого города понимают друг друга и исследуют окружающий мир только посредством этого языка. Если сменить язык в одном месте, все будут сбиты с толку.
А теперь представьте другой город Б, в котором все дома говорят на разных языках. Все по-разному взаимодействуют с миром, нет никакого «универсального» способа понимания или устойчивой организации общения. Если один что-то изменит, это ни на кого не повлияет.
Этот пример помогает проиллюстрировать одно из основных различий между SQL (реляционной) и NoSQL (нереляционной) базами данных. Из него уже можно сделать определённые выводы.
Реляционные базы данных используют язык структурированных запросов (SQL) для того, чтобы обрабатывать данные и управлять ими. С одной стороны, это довольно удобно: SQL — один из наиболее разносторонних и общеупотребимых вариантов, так что это безопасный выбор. Также этот язык подходит для сложных запросов. С другой стороны, с этим языком идут определенные ограничения. В SQL нужно использовать заданные наперед схемы и определять структуру данных перед началом работы с нею. К тому же, все данные должны иметь одну и ту же структуру. Как в случае с городом А, перемена в структуре может обернуться сложностями и разрушить всю систему.
Нереляционные базы данных, напротив, обладают гибкими схемами для неструктурированных данных. Они могут храниться по-разному: в колонках, документах, графах или в виде хранилища «ключ-значение». Эта гибкость позволяет:
- Можно создавать документы, не определяя их структуру заранее;
- Каждый документ может обладать собственной уникальной структурой;
- Синтаксис может различаться в разных базах данных;
- В процессе работы можно добавлять новые поля.
Масштабируемость
В большинстве случаев SQL БД можно масштабировать вертикально, то есть можно проводить увеличение нагрузки на каждом отдельном сервере, повышая мощности ЦП, ОЗУ, твердотельного диска. А вот NoSQL БД можно масштабировать горизонтально. Это значит, что нагрузка распределяется благодаря разделению данных или добавлению большего количества серверов. Это как если бы вы добавляли больше этажей к зданию либо добавляли больше зданий к району. В последнем варианте система может получиться более крупной и мощной. Именно поэтому для крупных или часто меняющихся БД обычно выбирают NoSQL.
Структура
SQL БД имеют форму таблиц, а в NoSQL БД данные представляются в виде документов, пар «ключ-значение», графов или хранилищ wide-column. Из-за этого реляционные (SQL) базы лучше использовать для приложений, в которых нужно переходить между несколькими записями (например, система бухучета), или для систем устаревшего вида, которые при создании имели реляционную структуру.
Примерами SQL БД являются ySQL, Oracle, PostgreSQL и Microsoft SQL Server, а NoSQL БД — MongoDB, BigTable, Redis, RavenDB Cassandra, HBase, Neo4j и CouchDB.
SQL против NoSQL: MySQL либо MongoDB
Раз уж мы разобрались, в чем состоит разница SQL и NoSQL, рассмотрим ключевые различия между ними на примере MySQL и MongoDB.
MySQL: SQL (реляционная) база данных
Ниже представлены сильные стороны MySQL:
- Сформированность: MySQL — хорошо известная база данных, то есть она обладает крупным коммьюнити, широкими возможностями тестирования и стабильностью;
- Совместимость: MySQL доступна на всех основных платформах, включая Linux, Windows, Mac, BSD и Solaris. Также у нее есть адаптеры для таких языков, как Node.js, Ruby, C#, C++, Java, Perl, Python и PHP, то есть эта система не ограничена языком запросов SQL;
- Экономичность: Система является открытой и бесплатной;
- Воспроизводимость: Базу данных MySQL можно использовать на разных узлах, что позволяет снизить нагрузку и повысить масштабируемость и доступность приложения;
- Разделение данных: Несмотря на то что эту процедуру можно проводить на не всех SQL БД, серверы MySQL позволяют это сделать. Это не только экономично, но и может быть полезно для приложения.
MongoDB: NoSQL (нереляционная) база данных
Ниже представлены сильные стороны MongoDB:
- Динамичность: Как говорилось ранее, динамическая схема гарантирует гибкость, позволяющую менять структуру без редактирования существующих данных;
- Масштабируемость: MongoDB можно масштабировать горизонтально, благодаря чему уменьшается нагрузка для бизнеса;
- Легкость в управлении: Для этой базы данных не требуется администратор. Так как она достаточно дружелюбна в отношении юзеров, воспользоваться ей могут как разработчики, так и администраторы;
- Скорость: Эта БД показывает отличные результаты в работе с короткими запросами;
- Гибкость: В MongoDB можно добавлять новые столбцы и поля, не влияя на уже существующие записи и производительность приложения.
Какую базу данных выбрать для своего проекта?
MySQL — отличный выбор для любого приложения, которому будет удобно пользоваться ее заранее определенной структурой и готовыми схемами. Например, это касается приложений, которые осуществляют переходы между нескольким записями (системы бухучета или управления инвентарем) или основаны на устаревших системах (им подойдет структура MySQL).
MongoDB, напротив, подойдет для бизнесов с быстрым ростом или для баз данных, в которых не используются определенные схемы. Точнее, если у вас не получается определить схему для БД или структуры постоянно меняются (как часто бывает с мобильными приложениями, аналитикой, работающей в реальном времени, системами менеджмента контента и т. д.), выбирайте MongoDB.
Разница между MySQL и ORACLE
MySQL и Oracle являются популярным программным обеспечением для управления реляционными базами данных, разработанным корпорацией Oracle.
MySQL: его имя представляет собой сочетание слов «My» и «SQL», где «My» — это имя дочери соучредителя Майкла Видениуса. А полная форма SQL — это язык структурированных запросов. Это самая популярная бесплатная система управления базами данных с открытым исходным кодом, разработанная и поддерживаемая корпорацией Oracle.
ORACLE: широко известная как Oracle RDBMS, мультимодельная система управления базами данных, производимая и продаваемая корпорацией Oracle. База данных Oracle, обычно используемая для работы с хранилищем данных (DW), оперативной обработкой транзакций (OLTP) и их смешиванием (DW & OLTP)
MySQL | Oracle |
MySQL является бесплатной базой данных с открытым исходным кодом. | Oracle является коммерческой базой данных. |
Это легкая, простая СУБД, очень хорошо подходящая для веб проектов. | Oracle очень мощеная база данных, позволяющая писать любые сложные системы, как в банковской, ERP, страховой, финансовой сферах. |
MySQL не поддерживает распределенные базы данных. | Oracle поддерживает распределенные базы данных. |
Mysqlhotcopy и mysqldump являются утилитами резервного копирования для MySQL. | Oracle имеет различные типы резервных копий, такие как облачное резервное копирование, горячее резервирование, экспорт, импорт данных. Он предлагает самую популярную утилиту резервного копирования под названием Recovery Manager (RMAN) |
Временные таблицы будут отображаться только для определенного сеанса. Эти таблицы будут удалены автоматически, как только сессия закончится. | Таблицы должны быть удалены явно. Они видны всем сессиям. |
MySQL не поддерживает никаких дополнительных функций. | Oracle поддерживает несколько расширений и программ на своем сервере базы данных, например, Active Data Guard, Audit Vault, Partitioning, Data Mining и т.д. |
MySQL не имеет Tablespace, управления ролями, sanapshots и автоматического управления хранением. | С другой стороны, Oracle обладает всеми этими функциями. |
MySQL написан на C и C ++ | Oracle написан на ассемблере, C и C ++ |
Некоторые наиболее популярные компании, которые используют базу данных MySQL: YouTube, PayPal, Google, Facebook, Twitter, GitHub, eBay, LinkedIn и т.д. | Некоторые наиболее популярные компании, использующие базы данных Oracle: CAIRN India, TVS Motor Company, Vilene, National food Australia, ENEL и т.д. |
Официальный сайт: www.mysql.com | Официальный сайт: www.oracle.com/database |
Выбрать СУБД между MySQL, PostgreSQL, MariaDB и MSSQL? — Хабр Q&A
Добрый день! Я разрабатываю SaaS-приложение, и сейчас встал выбор СУБД для хранения основных данных. Начинал разработку на MySQL, но сейчас не уверен в выборе. Переезд на другую СУБД на данном этапе для меня не составит проблем (использую PDO). далек от ясного понимания что такое «высокие нагрузки» для СУБД. Просто по моим расчетам примерно через год база будет весьма увесистой (см. ниже)Основной выбор стоит между MySQL, PostgreSQL, MariaDB. Также, возможен, но не приветствуется вариант Microsoft SQL Server на Windows Azure
Ситуация такова:
- Сложных запросов к базе нет. Максимум JOIN из двух таблиц
- Большая часть запросов — чтение
- Есть одна самая важная и «главная» таблица (структура таблицы ниже под спойлером). Таблица будет расти примерно на 10-30 тысяч записей в сутки. Запись данных в эту таблицу — самое главное!
- Большая часть запросов на чтение будет как раз к «главной» таблице. По этой таблице будет осуществляться поиск по любому из полей (в крайне редких случаях ~0.5% — по нескольким сразу). Поиск должен осуществляться быстро (не смотря на пункт №3)
- К «главной» таблице скорее всего будут добавлены индексы к каждому из полей сразу для двух полей (ownerID и Имя поля т.к. ownerID будет указан во всех запросах). Быстрый поиск будет нужен по любому из полей, но это не столь приоритетная задача. (Или лучше использовать Sphinx?)
- Львиная доля запросов (~80%) на чтение к «главной» таблице — простые select’ы по индексам from и personalID с limit = 20. Остальные запросы по любым другим полям по индексам (которых пока нет) ownerID и Имя поля, также с limit = 20
- Изменения данных в записях «главной» таблицы будут происходить крайне редко. Никакие записи из таблицы удаляться не будут.
- Поддержка транзакций и внешних ключей не обязательна
- Нужна возможность репликации данных типа master-slave
- Возможность шардинга на уровне СУБД приветствуется
- Крайне важна надежность БД (т.е. такой крах, как у MyISAM с ручным восстановлением сразу отпадает)
- К «главной» таблице могут добавляться новые поля. Это конечно крайне редкое явление и далеко не самое важное требование, но добавление нового столбца к таблице размером с десяток ГБ для MySQL весьма длительный процесс, а выносить новые поля в отдельную таблицу очень не хочется
- Всё это по-началу будет крутиться на таком вот выделенном сервере
- Другие таблицы будут расти медленно, и обращения к ним будут достаточно редкими, за них я не переживаю. Часто обновляемые данные у меня крутятся в redis’e
Структура «главной» таблицы
CREATE TABLE IF NOT EXISTS `clients` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`personalID` int(11) NOT NULL,
`ownerID` int(11) NOT NULL,
`fromID` int(11) NOT NULL DEFAULT '4',
`fromDomain` varchar(255) NOT NULL,
`datetime` datetime NOT NULL,
`status` int(11) NOT NULL DEFAULT '0',
`paid` tinyint(1) NOT NULL DEFAULT '0',
`paymentType` tinyint(4) NOT NULL DEFAULT '1',
`wmSum` float NOT NULL DEFAULT '0',
`wmCommission` float NOT NULL DEFAULT '20',
`sysNumber` varchar(14) NOT NULL,
`sysNumberLastUpdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`sysNumberStatus` varchar(250) NOT NULL,
`timezone` float NOT NULL,
`comment` varchar(500) NOT NULL,
`countryID` int(11) NOT NULL,
`postIndex` varchar(6) NOT NULL,
`region` varchar(500) NOT NULL,
`city` varchar(500) NOT NULL,
`address` varchar(500) NOT NULL,
`fio` varchar(500) NOT NULL,
`phone` varchar(15) NOT NULL,
`email` varchar(255) NOT NULL,
`price` float NOT NULL,
`quantity` int(11) NOT NULL DEFAULT '1',
`label` varchar(30) NOT NULL,
`tag` int(11) NOT NULL,
`ip` varchar(15) NOT NULL,
`referer` varchar(200) NOT NULL,
PRIMARY KEY (`id`),
KEY `from` (`ownerID`,`fromID`),
KEY `paid` (`paid`),
KEY `status` (`status`),
KEY `label` (`label`),
KEY `sysNumberLastUpdate` (`sysNumberLastUpdate`),
KEY `personalID` (`ownerID`,`personalID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
P.S. Желающих отправить меня гуглить прошу даже не отвечать. Найти информацию по сравнению актуальных версий разных СУБД мне не удалось, а изучать возможности, плюсы и минусы PostgreSQL, Microsoft SQL Server и MariaDB для человека, который с ними не работал весьма долгая задача. Да и в MySQL я далеко не эксперт, и подобный крупный проект для меня дело новое, да и возможности MySQL от версии к версии отличаются. Единственное, что я точно знаю, так это то, что таблицы типа MyISAM в MySQL мне точно не подойдут
Сравнение MySQL и PostgreSQL | Losst
Реляционные базы данных использовались на протяжении длительного времени. Они стали популярными благодаря системам управления, которые реализуют реляционную модель настолько хорошо, что она является наилучшим способом работы с данными, особенно для критически важных приложений и служб.
MySQL существует достаточно давно и зарекомендовала себя как отличное решение, Postgresql пришла на рынок приблизительно в то же самое время, но предоставляет достаточно много интересных функций и возможностей, благодаря чему стремительно набирает популярность. В этой статье мы попытаемся выполнить сравнение MySQL vs Postgresql, сравним основные отличия этих систем, выясним как они работают и попытаемся понять какая система будет лучше для вашего проекта.
Содержание статьи:
Системы управления базами данных
Базы данных предназначены для структурированного хранения и быстрого доступа к различным данным. Каждая база данных, кроме самих данных, должна иметь определенную модель работы, по которой будет выполняться обработка данных. Для управления базами данных используются СУБД или системы управления базами данных, именно к таким программам относятся MySQL и Postgresql.
Реляционные системы управления базами данных позволяют размещать данные в таблицах, связывая строки из разных таблиц и, таким образом, связывая разные, объединенные логически данные. Перед тем, как вы сможете сохранять данные, необходимо создать таблицы определенного размера и указать тип данных для каждого столбца. Столбы представляют поля данных, а сами данные размещены в строках. Обе системы управления базами данных, и MySQL vs Postgresql принадлежат к реляционным. Дальше мы рассмотрим подробнее чем отличаются обе программы. А теперь перейдем к более детальному рассмотрению.
Краткая история
MySQL
Разработка MySQL началась еще в 90х годах. Первый внутренний выпуск базы данных состоялся в 1995 году. За это время разработкой программы занимались несколько компаний. Разработка была начата шведской компанией MySQL AB, которую приобрела Sun Microsystems, которая, собственно перешла в собственность Oracle. На данный момент, начиная с 2010 года, разработкой занимается Oracle.
Postgresql
Разработка Postrgresql началась в далеком 1986 году в стенах Калифорнийского университета Беркли. Разработка длилась почти восемь лет, затем проект разделился на две части коммерческую базу данных IIlustra и полностью свободный проект Postrgesql, который разрабатывается энтузиастами.
Хранение данных
MySQL
MySQL — это реляционная база данных, для хранения данных в таблицах используются различные движки, но работа с движками спрятана в самой системе. На синтаксис запросов и их выполнение движок не влияет. Поддерживаются такие основные движки MyISAM, InnoDB, MEMORY, Berkeley DB. Они отличаются между собой способом записи данных на диск, а также методами считывания.
Postgresql
Postgresql представляет из себя объектно реляционную базу данных, которая работает только на одном движке — storage engine. Все таблицы представлены в виде объектов, они могут наследоваться, а все действия с таблицами выполняются с помощью объективно ориентированных функций. Как и в MySQL все данные хранятся на диске, в специально отсортированных файлах, но структура этих файлов и записей в них очень сильно отличается.
Стандарт SQL
Независимо от используемой системы управления базами данных, SQL — это стандартизированный язык выполнения запросов. И он поддерживается всеми решениями, даже MySQL или Postgresql. Стандарт SQL был разработан в 1986 году и за это время уже вышло нескольких версий.
MySQL
MySQL поддерживает далеко не все новые возможности стандарта SQL. Разработчики выбрали именно этот путь развития, чтобы сохранить MySQL простым для использования. Компания пытается соответствовать стандартам, но не в ущерб простоте. Если какая-то возможность может улучшить удобство, то разработчики могут реализовать ее в виде своего расширения не обращая внимания на стандарт.
Postgresql
Postgresql — это проект с открытым исходным кодом, он разрабатывается командой энтузиастов, и разработчики пытаются максимально соответствовать стандарту SQL и реализуют все самые новые стандарты. Но все это приводит к ущербу простоты. Postgresql очень сложный и из-за этого он не настолько популярен как MySQL.
Возможности обработки
Из предыдущего пункта выплывают и другие отличия postgresql от mysql, это возможности обработки данных и ограничения. Естественно, соответствие более новым стандартам дает более новые возможности.
MySQL
При выполнении запроса MySQL загружает весь ответ сервера в память клиента, при больших объемах данных это может быть не совсем удобно. В основном по функциям Postgresql превосходит Mysql, дальше рассмотрим в каких именно.
Postgresql
Postgresql поддерживает использование курсоров для перемещения по полученным данным. Вы получаете только указатель, весь ответ хранится в памяти сервера баз данных. Этот указатель можно сохранять между сеансами. Здесь поддерживается построение индексов сразу для нескольких столбцов таблицы. Кроме того, индексы могут быть различных типов, кроме hash и b-tree доступны GiST и SP-GiST для работы с городами, GIN для поиска по тексту, BRIN и Bloom.
Postgresql поддерживает регулярные выражения в запросах, рекурсивных запросов и наследования таблиц. Но тут есть несколько ограничений, например, вы можете добавить новое поле только в конец таблицы.
Производительность
Базы данных должны обязательно быть оптимизированы для окружения, в котором вы будете работать. Исторически так сложилось что MySQL ориентировалась на максимальную производительность, а Postgresql разрабатывалась как база данных с большим количеством настроек и максимально соответствующую стандарту. Но со временем Postgresql получил много улучшений и оптимизаций.
MySQL
В большинстве случаев для организации работы с базой данных в MySQL используется таблица InnoDB, эта таблица представляет из себя B-дерево с индексами. Индексы позволяют очень быстро получить данные из диска, и для этого будет нужно меньше дисковых операций. Но сканирование дерева требует нахождения двух индексов, а это уже медленно. Все это значит что MySQL будет быстрее Postgresql только при использовании первичного ключа.
Postgresql
Вся заголовочная информация таблиц Postgresql находится в оперативной памяти. Вы не можете создать таблицу, которая будет не в памяти. Записи таблицы сортируются по индексу, а поэтому вы можете их очень быстро извлечь. Для большего удобства вы можете применять несколько индексов к одной таблице.
В целом PostgreSQL работает быстрее, за исключениям использования первичных ключей. Давайте рассмотрим несколько тестов с различными операциями:
Типы данных
Один из основных моментов обоих баз данных это поддерживаемые типы данных, которые вы можете использовать. Поскольку оба решения пытаются соответствовать синтаксису SQL, то они имеют похожие наборы, но все же кое-чем отличаются.
MySQL
MySQL поддерживает такие типы данных:
- TINYINT: очень маленькое целое.;
- SMALLINT: маленькое целое;
- MEDIUMINT: целое среднего размера;
- INT: целое нормального размера;
- BIGINT: большое целое;
- FLOAT: знаковое число с плавающей запятой одинарной точности;
- DOUBLE, DOUBLE PRECISION, REAL: знаковое число с плавающей запятой двойной точности
- DECIMAL, NUMERIC: знаковое число с плавающей запятой;
- DATE: дата;
DATETIME: комбинация даты и времени; - TIMESTAMP: отметка времени;
- TIME: время;
YEAR: год в формате YY или YYYY; - CHAR: строка фиксированного размера, дополняемая справа пробелами до максимальной длины;
- VARCHAR: строка переменной длины;
- TINYBLOB, TINYTEXT: двоичные или текстовые данные максимальной длиной 255 символов;
- BLOB, TEXT: двоичные или текстовые данные максимальной длиной 65535 символов;
- MEDIUMBLOB, MEDIUMTEXT: текст или двоичные данные;
- LONGBLOB, LONGTEXT: текст или двоичные максимальной данные длиной 4294967295 символов;
- ENUM: перечисление;
- SET: множества.
Postgresql
Поддерживаемые типы полей в Postgresql достаточно сильно отличаются, но позволяют записывать точно те же данные:
- bigint: знаковое 8-байтовое целое;
- bigserial: автоматически увеличиваемое 8-байтовое целое;
- bit: двоичная строка фиксированной длины;
- bit varying: двоичная строка переменной длины;
- boolean: флаг;
- box: прямоугольник на плоскости;
- byte: бинарные данные;
- character varying: строка символов фиксированной длины;
- character: строка символов переменной длины;
- cidr: сетевой адрес IPv4 или IPv6;
- circle: круг на плоскости;
- date: дата в календаре;
- double precision: число с плавающей запятой двойной точности;
- inet: адрес интернет IPv4 или IPv6;
- integer: знаковое 4-байтное целое число;
- interval: временной промежуток;
- line: бесконечная прямая на плоскости;
- lseg: отрезок на плоскости;
- macaddr: MAC-адрес;
- money: денежная величина;
- path: геометрический путь на плоскости;
- point: геометрическая точка на плоскости;
- polygon: многоугольник на плоскости;
- real: число с плавающей точкой одинарной точности;
- smallint: двухбайтовое целое число;
- serial: автоматически увеличиваемое четырехбитное целое число;
- text: строка символов переменной длины;
- time: время суток;
- timestamp: дата и время;
- tsquery: запрос текстового поиска;
- tsvector: документ текстового поиска;
- uuid: уникальный идентификатор;
- xml: XML-данные.
Как видите, типов данных в Postgresql больше и они более разнообразны, есть свои типы полей для определенных видов данных, которых нет MySQL. Отличие MySQL от Postgresql очевидно.
Разработка
Оба проекта имеют открытый исходный код, но развиваются по-разному. Развитие MySQL нравится далеко не всем. И в этом сравнение mysql и postgresql дает много отличий.
MySQL
База данных MySQL разрабатывается компанией Oracle и ходят слухи, что компания намерено тормозит развитие движка. Было создано очень много форков проекта, в том числе форк MariaDB от разработчика оригинальной MySQL. Но все же развитие остается медленным.
Postgresql
Как было сказано в начале статьи разработка началась в университете Беркли. Затем перешла в коммерческую компанию. Сейчас программа разрабатывается независимой группой программистов и советом нескольких компаний. Новые версии выпускаются достаточно активно и получают все новые и новые функции.
Выводы
В этой статье мы выполнили сравнение mysql и postgresql, рассмотрели основные отличия обоих систем управления базами данных и попытались понять что лучше postgresql или mysql. В общем результате лучшим по возможностях получается Postgresql, но он сложен и не везде его можно применять. MySQL проще, но не поддерживает некоторых интересных функций. А какую базу данных вы выберите для своего проекта? Почему именно ее? Напишите в комментариях!
На завершение видео с описанием возможностей и перспектив Postgresql: