MySQL (свободная реляционная система управления базами данных – СУБД) – это компактный многопоточный сервер баз данных, который отличается высокой скоростью работы, устойчивостью и простотой в использовании.
Изначально разрабатывался компанией TcX для решения внутренних задач – максимально быстрой обработки крупных баз данных. Внутри компании используется с 1996 года на сервере с более чем 40 БД, которые содержат 10000 таблиц, из которых более чем 500 имеют более 7 миллионов строк.
На сегодняшний день разработкой и поддержкой MySQL занимается корпорация Oracle, которая приобрела Sun Microsystems 27 января 2010 года, после чего и включила MySQL в линейку своих продуктов. Ранее (26 февраля 2008 года) Sun Microsystems заплатила за покупку MySQL AB 1 миллиард долларов США. Продукт распространяется как под GNU General Public License, так и под собственной коммерческой лицензией. Помимо этого, разработчики создают функциональность по заказу лицензионных пользователей, именно благодаря такому заказу почти в самых ранних версиях появился механизм репликации.
MySQL – это наиболее оптимальное решение для малых и средних приложений. Исходники сервера компилируются на множестве платформ. Наиболее полно возможности сервера проявляются на Unix-серверах, где есть поддержка многопоточности, что дает значительный прирост производительности. Входит в состав серверов WAMP, AppServ, LAMP и в портативные сборки серверов Денвер, XAMPP. Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы.
Благодаря поддержке огромного количества типов таблиц, MySQL является достаточно гибким. Пользователи могут выбирать и таблицы с полнотекстовым поиском MyISAM и таблицы с транзакциями в отдельных записях InnoDB. Кроме того, MySQL поставляется со специальным типом таблиц EXAMPLE, демонстрирующим принципы создания новых типов таблиц. Благодаря этому, а также открытой архитектуре и GPL-лицензированию, в MySQL возможно добавлять новые типы таблиц практически бесконечно.
MySQL-сервер является бесплатным для некоммерческого использования. Иначе – необходимо приобретение лицензии, стоимость которой на текущий момент составляет 190 евро.
Сообществом разработчиков MySQL созданы различные ответвления кода, такие как Drizzle, OurDelta, Percona Server, и MariaDB. Эти ответвления уже существовали на момент поглощения компании Sun корпорацией Oracle.
Возникновение MySQL
До 1994 года на рынке были представлены главным образом базы данных, предназначенные для работы со значительными объемами данных и сложными взаимосвязями, которые обладали различными возможностями, но в тоже время требовали значительных вычислительных ресурсов. К числу таких баз данных относятся Oracle, Informix и Sybase. СУБД, которые бы поддерживали SQL и были при этом доступны многим по цене, в это время не было.
Крупные корпорации и университеты могли себе позволить приобрести мощные вычислительные комплексы, а небольшие организации и пользователи пользовались слабыми настольными базами данных, такими, как Postgres, в которой использовалась разновидность языка QUEL (PostQUEL), которая требовала таких же ресурсов, что и ее аналоги, но не давала преимущества использования SQL в качестве языка запросов.
Тогда некий Дэвид Хьюз (ставший впоследствии, после публикации своей работы в Интернете, известным как Bamby), писавший на тот момент диссертацию в Университете Бонд (Австралия), занялся разработкой проекта Minerva Network Management System – системой наблюдения и контроля из одной или нескольких точек за группой систем. Главным элементом проекта должна была стать база данных для хранения информации обо всех компьютерах в сети. Сначала Хьюз решил использовать Postgres. Однако коллеги предложили использовать SQL в качестве языка запросов для Minerva, поскольку SQL является наиболее распространенным языком запросов, и, используя его, Minerva могла бы стать доступной в любой точке планеты, где стоит СУРБД, поддерживающая SQL. Это и послужило толчком к созданию MySQL.
Хьюз решил сам создать программу, которая будет в режиме реального времени транслировать SQL в PostQUEL. Свою программу он назвал miniSQL, или mSQL. Она перехватывала предложения SQL, посылаемые Minerva, преобразовывала их в PostQUEL и пересылала результат в Postgres. Некоторое время такая ситуация устраивала Хьюза. Однако в результате дальнейшего роста Minerva, стало очевидно, что на тех ограниченных ресурсах, которые ей доступны, поддерживать тот небольшой набор характеристик, который ей необходим, ни Postgres, ни какая другая большая СУРБД не смогут. Так, например, для того, чтобы реализовать возможность одновременного подключения Minerva сразу к нескольким базам данных, Postgres требовал одновременного запуска нескольких экземпляров сервера базы данных.
Для решения этих проблем Хьюз проанализировал работу Minerva, и, оказалось, основными запросами, генерируемыми Minerva, были: «insert», «delete» и «select». Поскольку у Хьюза уже был mSQL, осуществлявший трансляцию SQL, ему требовалось только создание сервера базы данных, удовлетворяющего его потребностям.
И тут в игру вступает Майкл Монти Видениус, который и считается изобретателем MySQL. В 1979 году он разработал средство управления базами данных, которое называлось UNIREG. В дальнейшем UNIREG была расширена для поддержки больших баз данных и была переписана на нескольких языках. В 1994 году компания TcX стала разрабатывать приложения для www с использованием UNIREG. Однако, в связи с большими накладными расходами, UNIREG не могла успешно использоваться для динамической генерации Web-страниц. Поэтому Видениус решил связаться с автором mSQL Хьюзом, чтобы предложить ему подключить mSQL к обработчику B+ ISAM в UNIREG. Однако Хьюз успешно продвинулся на пути к mSQL 2, и компания решила создать сервер баз данных под свои нужды.
В TcX взяли за основу UNIREG и использовали утилиты сторонних разработчиков для mSQL, написали API для своей системы, который изначально сильно совпадал с API для mSQL. Однако это позволяло любому пользователю mSQL, желающему перейти на сервер баз данных ТсХ, внести в свой код незначительные изменения. Исходный код новой базы данных был полностью оригинальным. Таким образом, в мае 1995 года у компании имелась база данных MySQL 1.0, полностью удовлетворяющая потребностям компании.
В 1995 году Дэвид Оксмарк, работающий в компании Detron HB и являющийся бизнес-партнером фирмы, начал активно предлагать ТсХ распространять СУБД MySQL через интернет. Дэвид даже принял участие в работе над документацией. В результате версия 3.11.1 СУБД MySQL была выпущена в свет в 1996 году в виде бинарного дистрибутива для работы под управлением ОС Linux и Solaris. Сегодня MySQL работает на многих платформах и доступен как в двоичных кодах, так и в исходных текстах.
На сегодняшний день MySQL стал самым популярным средством для работы с базами данных в РНР. Это связано в первую очередь с тем, что поддержка этого сервера включается в поставку РНР. К тому же, популярности MySQL способствуют достаточно хорошие характеристики и широкий набор стандартных интерфейсных функций, которые крайне просты в использовании.
Лицензионная политика MySQL отличается большей гибкостью в сравнении с другими серверами баз данных. По сути, MySQL распространяется бесплатно за исключением тех случаев, когда намереваются продавать услуги, создаваемые с ее помощью.
MySQL обладает отличной переносимостью и может, с тем же успехом, использоваться на коммерческих операционных системах, таких как Solaris, Irix или Windows, и на любой аппаратуре вплоть до мощных серверов. Более того, так же как и ее более «дорогие соперники», она позволяет обрабатывать большие базы данных, содержащие миллионы записей.
Название и логотип
Что касается названия, то существует несколько версий его возникновения. Первая версия говорит о том, что использование префикса "my" объясняется тем, что ТсХ базовый каталог, а также значительное число библиотек и утилит в течение десятка лет обозначались именно таким префиксом. Поэтому логично его было использовать и в данном случае.
Вторая версия опирается на то, что Майкл Монти Видениус назвал новый продукт именно MySQL по имени своей дочери – My. Сам он не опровергает ни первую, ни вторую версии.
Логотип MySQL в виде дельфина носит имя «Sakila». Он был выбран из большого списка предложенных пользователями «имён дельфина». Имя «Sakila» было отправлено Open Source-разработчиком Ambrose Twebaze.
Возможности MySQL
Главная особенность MySQL в том, что он поддерживает язык запросов SQL в стандарте ANSI 92, и кроме этого имеет множество расширений к этому стандарту, которых нет ни в одной другой системе управления базами данных.
Краткий перечень возможностей MySQL:
- Поддерживается эффективная работа неограниченного количества пользователей, одновременно работающих с базой данных.
- Количество строк в таблицах может достигать 50 млн.
- Максимально быстрое выполнение команд. (Бытует мнение, что MySQL – самый быстрый сервер из существующих.)
- Простая и эффективная система безопасности.
Недостатки MySQL
Впрочем, и у MySQL существуют отдельные недостатки. Главным образом это связано с тем, что для достижения столь высокой скорости работы разработчикам пришлось пожертвовать некоторыми требованиями к реляционным системам управления базами данных.
Итак, в MySQL отсутствуют:
- Поддержка вложенных запросов, типа SELECT FROM table1 WHERE id IN (SELECT id FROM table2) (в ранних версиях).
- Не реализована поддержка транзакций. Взамен предлагается использовать LOCK/UNLOCK TABLE.
- Нет поддержки внешних (foreign) ключей.
- Нет поддержки триггеров и хранимых процедур.
- Нет поддержки представлений (VIEW). В версии 3.23 планируется возможность создавать представления.
По словам создателей, именно пункты 2-4 дали возможность достичь высокого быстродействия. Их реализация существенно снижает скорость сервера. Эти возможности не являются критичными при создании Web-приложений, что в сочетании с высоким быстродействием и малой ценой позволило серверу приобрести большую популярность.
Лицензирование
MySQL имеет двойное лицензирование. Может распространяться в соответствии с условиями лицензии GPL. Однако по условиям GPL, если какая-либо программа включает исходные коды MySQL, то она тоже должна распространяться по лицензии GPL. Это может расходиться с планами разработчиков, не желающих открывать исходные тексты своих программ. Для таких случаев предусмотрена коммерческая лицензия, которая также обеспечивает качественную сервисную поддержку.
Платформы
MySQL портирована на большое количество платформ: AIX, BSDi, FreeBSD, HP-UX, Linux, Mac OS X, NetBSD, OpenBSD, OS/2 Warp, SGI IRIX, Solaris, SunOS, SCO OpenServer, UnixWare, Tru64, Windows 95, Windows 98, Windows NT, Windows 2000, Windows XP, Windows Server 2003, WinCE, Windows Vista и Windows 7. Существует также порт MySQL к OpenVMS. Важно отметить, что на официальном сайте СУБД для свободной загрузки предоставляются не только исходные коды, но и откомпилированные и оптимизированные под конкретные операционные системы готовые исполняемые модули СУБД MySQL.
Языки программирования
MySQL имеет API для языков Delphi, C, C++, Эйфель, Java, Лисп, Perl, PHP, Python, Ruby, Smalltalk, Компонентный Паскаль и Tcl, библиотеки для языков платформы .NET, а также обеспечивает поддержку для ODBC посредством ODBC-драйвера MyODBC.
История версий
- Первый внутренний выпуск MySQL состоялся 23 мая 1995 года.
- Версия для Windows систем (Windows 95 и NT) выпущена 8 января 1998.
- Версия 3.23: бета-версия в июне 2000, релиз в январе 2001.
- Версия 4.0: бета в августе 2002, релиз в марте 2003.
- Версия 4.1: бета в июне 2004, релиз в октябре 2004.
- Версия 5.0: бета в марте 2005, релиз в октябре 2005.
- Версия 5.1: разработка велась с ноября 2005, релиз в ноябре 2008.
- Версия 5.4: бета в апреле 2009, не была выпущена.
- Версия 5.5: релиз в декабре 2010.
- Версия 5.6: в разработке (5.6.6 m9, 7 августа 2012).
MySQL 4.0
Несмотря на то, что версия 4.0 является устаревшей, она всё ещё имеет значительное распространение. Основные возможности этой версии:
- практически полная реализация ANSI SQL-99, плюс расширения;
- межплатформенная совместимость;
- независимые типы таблиц (MyISAM для быстрого чтения, InnoDB для транзакций и ссылочной целостности);
- транзакции;
- поддержка SSL;
- кэширование запросов;
- репликация: один головной сервер на одного подчинённого, много подчинённых на один головной;
- полнотекстовая индексация и поиск с использованием типа таблиц MyISAM;
- внедрённая библиотека базы данных;
- поддержка Юникода (UTF-8);
- таблицы InnoDB, обеспечивающие соответствие требованиям ACID;
- встроенный сервер, позволяющий включать MySQL в автономные приложения.
MySQL 4.1
Рекомендованной версией на 2005 год является MySQL 4.1, которая вышла 27 октября 2004. Она содержит следующие нововведения:
- вложенные запросы и производные таблицы.
- новая система кодировок и сортировок;
- более быстрый и гибкий протокол клиент-сервер с поддержкой подготовленных запросов, обеспечивающий их оптимальное исполнение;
- новая программа установки и настройки для Microsoft Windows и Linux;
- защищённые через OpenSSL соединения клиент-сервер;
- высоко-оптимизированная библиотека, которая может быть использована в сторонних программах;
- полноценная поддержка Юникода (UTF-8 и UCS2);
- стандартные пространственные типы данных GIS, для хранения географической информации;
- улучшенный полнотекстовый поиск и система помощи.
MySQL 5.0
Версия MySQL 5.0 была выпущена 24 октября 2005 года, в этой версии значительно расширена функциональность, которая ставит MySQL в один ряд с коммерческими СУБД. Если раньше СУБД MySQL обвиняли в недостаточной поддержке стандарта SQL, то с появлением пятой версии появилась практически полная поддержка стандарта SQL. MySQL 5.0 содержит следующие нововведения:
- хранимые процедуры и функции;
- обработчики ошибок;
- курсоры;
- триггеры;
- представления;
- информационная схема (так называемый системный словарь, содержащий метаданные).
MySQL 5.1
Версия MySQL 5.1 продолжает путь к стандарту SQL:2003. MySQL 5.1 содержит следующие нововведения:
- Сегментирование — возможность разбиения одной большой таблицы на несколько частей, размещенных в разных файловых системах, основываясь на определенной пользователем функции. При определенных условиях это может дать серьёзное увеличение производительности и облегчает масштабирование таблиц.
- Изменено поведение ряда операторов, для обеспечения большей совместимости со стандартом SQL2003.
- Построчная репликация (row-based replication), при которой в бинарный лог будет записываться только информация о реально измененных строках таблицы вместо оригинального (и, возможно, медленного) текста запроса. Построчную репликацию можно использовать только для определенных типов sql-запросов, в терминах MySQL — смешанная репликация (mixed replication).
- Встроенный планировщик периодически запускаемых работ. По синтаксису добавление задачи похоже на добавление триггера к таблице, по идеологии — на crontab.
- Дополнительный набор функций для обработки XML, реализация поддержки XPath.
- Новые средства диагностики проблем и утилиты для анализа производительности. Расширены возможности по управлению содержимым лог-файлов, логи теперь могут быть сохранены и в таблицах general_log и slow_log. Утилита mysqlslap позволяет провести нагрузочное тестирование БД с записью времени реакции на каждый запрос.
- Для упрощения операции обновления подготовлена утилита mysql_upgrade, которая выполнит проверку всех существующих таблиц на предмет совместимости с новой версией, и при необходимости выполнит надлежащие корректировки.
- MySQL Cluster отныне выпущен как отдельный продукт, базирующийся на MySQL 5.1 и хранилище NDBCLUSTER.
- Значительные изменения в работе MySQL Cluster, такие, как, например, возможность хранения табличных данных на диске.
- Возврат к использованию встроенной библиотеки libmysqld, отсутствовавшей в MySQL 5.0.
- API для плагинов, которое позволяет загружать сторонние модули, расширяющие функциональность (например, полнотекстовый поиск), без перезапуска сервера.
- Реализация парсера полнотекстового поиска в виде plug-in.
- Новый тип таблиц Maria (устойчивый к сбоям клон MyISAM).
Тип таблиц Maria
Maria (начиная с версии 5.2.x — Aria) — расширенная версия хранилища MyISAM, с добавлением средств сохранения целостности данных после краха.
Основные достоинства Maria:
- В случае краха производится откат результатов выполнения текущей операции или возврат в состояние до команды LOCK TABLES. Реализация через ведение лога операций.
- Возможность восстановления состояния из любой точки в журнале операций, включая поддержку CREATE/DROP/RENAME/TRUNCATE. Может быть использовано для создания инкрементальных резервных копий, через периодическое копирование журнала операций.
- Поддержка всех форматов столбцов MyISAM, расширена новым форматом «rows-in-block», использующим страничный способ хранения данных, при котором данные в столбцах могут кэшироваться.
- В будущем будет реализовано два режима: транзакционный и без отражения в журнале транзакций, для некритичных данных.
- Размер страницы данных равен 8 Кб (в MyISAM 1 Кб), что позволяет достичь более высокой производительности для индексов по полям фиксированного размера, но медленнее в случае индексирования ключей переменной длины.
MySQL 5.5
Ветка MySQL 5.5 базируется на невыпущенной серии MySQL 5.4 и содержит ряд значительных улучшений, связанных с повышением масштабируемости и производительности, среди которых:
- Использование по умолчанию движка InnoDB.
- Поддержка полусинхронного (semi-synchronous) механизма репликации, основанного на патчах к InnoDB от компании Google.
- Улучшение функций по секционированию данных. Расширенный синтаксис для разбиения больших таблиц на несколько частей, размещенных в файловых системах (partitioning). Добавлены операции RANGE, LIST и метод оптимизации «partition pruning».
- Новый механизм оптимизации вложенных запросов и JOIN-операций.
- Переработана система внутренних блокировок.
- Интегрированы патчи Google с оптимизацией работы InnoDB на процессорах с большим количеством ядер.
MySQL 6.0
Версия MySQL 6.0 была заморожена на стадии альфа-тестирования. Первоначально было принято решение о создании версии 5.2, вскоре эта версия была переименована в 6.0. Позже информация о MySQL 6.0 исчезла с сайта, а разработчики сосредоточились на версии 5.5 и следующей за ней версии 5.6.
Одним из основных нововведений версии 6.0 планировался новый тип таблиц Falcon, разработанный в качестве потенциальной замены для InnoDB компании Innobase, приобретённой компанией Oracle. В связи с приобретением в 2010 году Sun Microsystems тем же Oracle, судьба Falcon остаётся под вопросом.
Технические характеристики
Максимальный размер таблиц в MySQL 3.22 до 4 ГБ, в последующих версиях максимальный размер до 8 млн. ТБ.
Размер таблицы ограничен её типом. В общем случае тип MyISAM ограничен предельным размером файла в файловой системе операционной системы. Например в NTFS этот размер теоретически может быть до 32 эксабайт. В случае InnoDB одна таблица может храниться в нескольких файлах, представляющих единое табличное пространство. Размер последнего может достигать 64 терабайт.
В отличие от MyISAM в InnoDB имеется значительное ограничение на количество столбцов, которое можно добавить в одну таблицу. Размер страницы памяти по умолчанию составляет 16 килобайт, из которых под данные отведено 8123 байта. Размер указателя на динамические поля составляет 20 байт. Таким образом, в случае использования динамического формата строки (ROW_FORMAT=DYNAMIC), одна таблица может вместить максимум 409 столбцов типа blob или text.
Начиная с версии 4.1 в СУБД MySQL внедрена новая система кодировок и сортировок. При использовании кодировки Windows-1251, перед выполнением SQL-инструкций необходимо настроить кодировку соединения при помощи операторов:
SET character_set_client='cp1251';
SET character_set_results='cp1251';
SET character_set_connection='cp1251';
Эти три оператора эквивалентны вызову одного оператора:
SET NAMES 'cp1251'
Переменная character_set_client устанавливает кодировку данных отправляемых от клиента, переменная character_set_results устанавливает кодировку данных отправляемых клиенту, переменная character_set_connection устанавливает кодировку, в которую преобразуется информация пришедшая от клиента, перед выполнением запроса на сервере.
При использовании Юникода UTF-8 этот оператор выглядит следующим образом:
SET NAMES 'utf8'
Кодировка ISO 8859-5 не поддерживается.