MySQL 5.0¶
MySQL 5.0 — это одна из основных версий свободной реляционной системы управления базами данных (СУБД) MySQL, выпущенная 22 октября 2005 года. Данная версия стала значительным этапом в развитии продукта, поскольку в ней были реализованы такие ключевые возможности, как поддержка хранимых процедур, триггеров, представлений и курсоров, что приблизило MySQL по функциональности к коммерческим СУБД того времени.
¶История
Разработка MySQL 5.0 велась компанией MySQL AB (Швеция) в течение нескольких лет. Первые альфа-версии появились в декабре 2004 года, бета-версии — в марте 2005 года, а релиз-кандидаты — летом 2005 года. Финальный стабильный релиз (5.0.15) был выпущен 22 октября 2005 года. Версия 5.0 стала последней крупной версией, разработанной под руководством MySQL AB до её поглощения корпорацией Sun Microsystems в 2008 году.
Основным нововведением, анонсированным ещё в 2003 году, была поддержка хранимых процедур и триггеров — функций, давно доступных в таких СУБД, как Oracle Database и Microsoft SQL Server. Реализация этих возможностей в MySQL 5.0 была встречена сообществом с интересом, но также и с критикой из-за ограниченной функциональности и отличий от стандарта SQL.
¶Ключевые возможности
¶Хранимые процедуры и функции
MySQL 5.0 ввела поддержку хранимых процедур и функций, написанных на языке SQL. Процедуры могли принимать параметры (IN, OUT, INOUT) и возвращать результаты. Реализация основывалась на стандарте SQL:2003, но имела ряд отличий, например, отсутствие поддержки RETURN в процедурах (вместо этого использовался OUT-параметр). Функции, в отличие от процедур, могли возвращать скалярное значение.
¶Триггеры
Триггеры в MySQL 5.0 позволяли автоматически выполнять набор SQL-операторов при вставке, обновлении или удалении строк в таблице. Поддерживались только триггеры для одной строки (FOR EACH ROW), а не для всей операции. Триггеры могли быть определены как до (BEFORE), так и после (AFTER) события. Максимальное количество триггеров на таблицу было ограничено шестью (по одному на каждое сочетание времени и события).
¶Представления (VIEW)
Представления в MySQL 5.0 реализовывались как виртуальные таблицы, основанные на результатах запроса SELECT. Они могли быть обновляемыми (если запрос удовлетворял определённым условиям) или необновляемыми. Представления упрощали работу с данными, скрывая сложные запросы и предоставляя доступ к подмножествам данных.
¶Курсоры
Курсоры в MySQL 5.0 позволяли обрабатывать результирующие наборы построчно, что было необходимо для хранимых процедур. Курсоры были только однонаправленными (только вперёд) и не поддерживали обновление данных через них. Они были реализованы как чувствительные (sensitive), то есть изменения в базе данных сразу отражались на курсоре.
¶Информационная схема (INFORMATION_SCHEMA)
MySQL 5.0 ввела поддержку стандартной информационной схемы, которая предоставляла метаданные о базах данных, таблицах, столбцах, индексах и других объектах через набор системных представлений. Это позволяло получать информацию о структуре базы данных без использования специфических команд SHOW.
¶Архитектура и хранение данных
MySQL 5.0 поддерживала несколько подсистем хранения (storage engines), каждая из которых имела свои особенности:
- MyISAM — подсистема по умолчанию для таблиц, не поддерживающая транзакции, внешние ключи и блокировки на уровне строк. Обеспечивала высокую скорость чтения.
- InnoDB — транзакционная подсистема с поддержкой ACID, внешних ключей и блокировок на уровне строк. Стала популярной для приложений, требующих целостности данных.
- MEMORY (HEAP) — хранила данные в оперативной памяти, что обеспечивало высокую скорость, но данные терялись при перезапуске сервера.
- MERGE — объединяла несколько таблиц MyISAM в одну логическую таблицу.
- ARCHIVE — сжимала данные для хранения больших объёмов редко используемой информации.
Версия 5.0 также поддерживала репликацию (один мастер и несколько слейвов), полнотекстовый поиск (только для MyISAM) и механизм кэширования запросов.
¶Производительность и масштабирование
MySQL 5.0 была оптимизирована для работы на однопроцессорных и многопроцессорных системах. Поддерживалось до 64 процессоров (в зависимости от операционной системы). Максимальный размер таблицы для InnoDB составлял 64 ТБ (при размере страницы 16 КБ), для MyISAM — 256 ТБ. Количество одновременных подключений могло достигать нескольких тысяч, но производительность при большом числе соединений снижалась из-за архитектурных ограничений.
¶Критика и ограничения
Несмотря на значительные улучшения, MySQL 5.0 подвергалась критике по ряду причин:
- Ограниченная реализация хранимых процедур: отсутствовала поддержка вложенных транзакций, обработчиков исключений (HANDLER) и динамического SQL в полном объёме.
- Проблемы с триггерами: триггеры не могли вызывать хранимые процедуры, не поддерживались рекурсивные триггеры и триггеры для нескольких строк.
- Отсутствие полноценной поддержки стандарта SQL: MySQL 5.0 не поддерживала оконные функции, рекурсивные запросы (CTE) и многие другие возможности SQL:2003.
- Проблемы с репликацией: репликация была асинхронной и могла приводить к рассинхронизации данных при сбоях.
- Безопасность: в версии 5.0 были обнаружены уязвимости, связанные с переполнением буфера и SQL-инъекциями, которые исправлялись в последующих обновлениях.
¶Влияние и наследие
MySQL 5.0 стала важной вехой в истории СУБД, поскольку она продемонстрировала способность MySQL конкурировать с коммерческими продуктами в области поддержки сложных бизнес-логик на уровне базы данных. Она широко использовалась в веб-приложениях, включая такие платформы, как WordPress, Joomla и Drupal. Версия 5.0 оставалась популярной до выхода MySQL 5.1 в 2008 году, которая добавила поддержку секционирования таблиц, событий и плагинов для подсистем хранения.
Поддержка MySQL 5.0 была прекращена компанией Oracle (которая приобрела Sun Microsystems в 2010 году) в январе 2012 года. Однако многие организации продолжали использовать её ещё несколько лет из-за стабильности и совместимости с существующими приложениями.
¶Источники
- MySQL 5.0 Reference Manual (Oracle Corporation, 2005–2012)
- «MySQL 5.0 New Features» by Michael Widenius (MySQL AB, 2005)
- «Understanding MySQL Internals» by Sasha Pachev (O'Reilly Media, 2007)
- «MySQL 5.0 Stored Procedures» by Guy Harrison (Apress, 2006)
- Release notes for MySQL 5.0 (MySQL AB, 2005)