Андрей Клочков

Что такое MySQL

Прежде чем делать выводы, стоит ли применять пакет MySQL в качестве сервера баз данных, вначале надо выяснить, что он собой представляет. MySQL - это реляционная СУБД.

MySQL поддерживает SQL (структурированный язык запросов) и может применяться в качестве SQL-сервера. Это означает, что общаться с сервером можно на языке SQL: клиент посылает серверу запрос, тот его обрабатывает и отдает клиенту только те данные, которые были получены в результате этого запроса. Тем самым клиенту не требуется выкачивать данные и производить вычисления, как, например, в Microsoft Access.

Кроме того, MySQL - это ПО с открытым кодом, т.е. его можно свободно изучать и изменять. Пакет распространяется на условиях GPL (General Public License), его можно бесплатно загрузить из Интернета (http://www.mysql.com) для некоммерческого применения.

С появлением Интернет-технологий, позволяющих создавать динамичные Web-страницы, необычайно возрос спрос и на СУБД, которые наиболее полно подходили бы для этого по быстродействию, надежности и стабильности. И здесь хорошо проявил себя пакет MySQL, который получился быстрым, простым и надежным, но, правда, за счет ухудшения функциональности (сразу оговоримся, что разработчики MySQL обещают добавить недостающие функции уже в ближайших версиях программы).

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

Недостатки

Вот краткий перечень основных функций, которых не хватает в MySQL.

Транзакции - позволяют объединить несколько SQL-запросов в одну единицу работы и в случае сбоя любого из запросов, входящего в эту единицу, выполнить откат, чтобы вернуть данные в исходное состояние. Поясним на примере.

Необходимо снять деньги с одного счета и положить на другой. Для этого нужно выполнить два SQL-запроса: первый - снять деньги с одного счета, второй - зачислить их на другой счет. Если не применять транзакции, то в случае сбоя при выполнении второго запроса деньги будут сняты со счета, но не будут зачислены на другой счет. Применение транзакций позволяет сделать откат, как если бы деньги вообще не снимались со счета.

Заметим, что при помощи команды LOCK TABLES в MySQL можно эмулировать транзакцию. Эта команда блокирует таблицу на время выполнения запросов, и тем самым обеспечивается целостность данных, но откат все равно нельзя сделать.

Триггеры - служат для автоматизации контроля за состоянием и работой базы данных. Триггер хранится в базе и срабатывает, когда происходит определенное событие. Возьмем тот же пример с переводом денег: в случае сбоя при выполнении второго запроса сработает триггер, который выполнит откат либо пошлет сообщение администратору базы данных.

Хранимые процедуры - это несколько SQL-команд, которые хранятся в базе данных под неким именем и в совокупности выполняют некую функцию. При помощи хранимых процедур можно расширить синтаксис SQL так, что он будет похож на обычный язык программирования (например, Oracle PL/SQL). В нашем примере с переводом денег два SQL-запроса можно было бы сохранить под одним именем, а потом вызвать эту процедуру, передав ей в качестве параметров два номера счета и сумму денег. Тогда оба запроса выполнялись бы в одной транзакции.

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

SELECT auto FROM autopark WHERE massa > !Больше чего? Я понятия 
	не имею, каково среднее значение!

Для этого среднее значение в поле massa нужно вычислить:

SELECT AVG(massa) FROM autopark

Если поддерживаются вложенные запросы, то эти два запроса можно вложить друг в друга:

SELECT auto FROM autopark WHERE massa >( SELECT AVG(massa) 
	FROM autopark)

Но в случае с MySQL среднее значение приходится находить отдельно и подставлять в другой запрос непосредственно в CGI-сценарии, что, несомненно, сказывается на производительности.

Инструкция UNION - попросту говоря, она объединяет вывод нескольких запросов в один, с возможностью исключить дубликаты строк.

Каскадное обновление данных - позволяет удалять и обновлять связанные данные. Например, при удалении из базы данных записи о клиенте из связанных таблиц автоматически удаляются все записи о заказах этого клиента.

Преимущества

А теперь перечислим преимущества MySQL.

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

Безопасность. Довольно высокий уровень безопасности обеспечивается благодаря базе данных mysql, создающейся при установке пакета и содержащей пять таблиц. При помощи этих таблиц можно описать, какой пользователь из какого домена с какой таблицей может работать и какие команды он может применять. Пароли, хранящиеся в базе данных, можно зашифровать при помощи встроенной в MySQL функции password().

Лицензия. Раньше лицензирование MySQL было немного запутанным; сейчас эта программа для некоммерческих целей распространяется бесплатно.

Открытость кода. Благодаря этому вы сможете сами добавлять в пакет нужные функции, расширяя его функциональность так, как вам требуется. Кстати, за отдельную плату для вас это могут сделать и сами авторы MySQL. Чтобы заказать расширение MySQL у создателей пакета, просто зайдите на сайт http://www.mysql.com и заполните соответствующую форму.

Надежность. Создатели MySQL потрудились на славу: насколько мне известно, этот пакет довольно стабилен и его трудно вывести из строя. Я не отслеживаю специально сводки результатов хакерских атак на MySQL, но мне ни разу не попадалось на глаза (в отличие от тех же Web-серверов) сообщение о том, что MySQL был поврежден в результате чьего-то злого умысла.

Ресурсы. Это может зависеть от разных факторов, но в любом случае суперкомпьютер вам не потребуется.

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

Переносимость. В настоящее время существуют версии программы для большинства распространенных компьютерных платформ. Это говорит о том, что вам не навязывают определенную операционную систему. Вы сами можете выбрать, с чем работать, например с Linux или Windows, но даже в случае замены ОС вы не потеряете свои данные и вам даже не понадобятся дополнительные инструменты для их переноса.

Не знаю, к недостаткам или преимуществам отнести тот факт, что у MySQL нет графического интерфейса пользователя (GUI). Мне, например, удобнее написать SQL-запрос вручную (кстати, результаты его выполнения можно перенаправить в файл), чем пользоваться мастером запросов, как в Microsoft SQL Server.

Существует несколько клиентских программ для MySQL, имеющих GUI, но они далеки от совершенства и по большей части только тормозят работу. Если вы предпочитаете GUI, то рекомендую скачать и попробовать эти программы, чтобы подтолкнуть их создателей к дальнейшему усовершенствованию своих изделий. Вот далеко не полный список программ с GUI:

  • Winmysqladmin - входит в Windows-дистрибутив MySQL, имеет стандартный графический интерфейс и позволяет администрировать MySQL;
  • MySqlManager - входит в Windows-дистрибутив MySQL, несет в себе клиентские функции (но ничего серьезного с ее помощью автору сделать так и не удалось);
  • MySQL Administrator for Windows - более "продвинутая" утилита сторонних разработчиков. Позволяет зарегистрировать и подключаться одновременно к нескольким MySQL-серверам, создавать, удалять и изменять структуру баз данных и таблиц, создавать в таблицах ключи, писать SQL-запросы и сохранять их в файле:
  • XMySQL - клиент MySQL для X Window-подобных систем. Предоставляет полный доступ к таблицам, допускает групповые вставки и удаления, имеет конструктор запросов и функции администрирования пакета. Программу можно найти по адресу http://web.wt.net/~dblhack/.

Более полный список всевозможных утилит для MySQL (а он очень велик) есть по адресу http://www.mysql.com/downloads/. Там вы найдете массу интересных и полезных вещей: экспорт данных из MySQL в Microsoft Access и обратно, драйверы ODBC и т.д.

Несмотря на отсутствие графического интерфейса, в пакет MySQL входят довольно мощные средства администрирования с интерфейсом командной строки. Ниже приведен их список с краткими описаниями утилит.

  • MySQLAdmin - главный инструмент администрирования MySQL. С его помощью вы можете создавать, уничтожать, изменять базы данных и полностью контролировать свой сервер.
  • MySQLDump - утилита резервирования данных.
  • MySQLAccess - позволяет изменять таблицы прав доступа и выводить их содержание в удобном для чтения виде.
  • MySQLBug - в случае ошибки в MySQL эта утилита создает для разработчиков программы отчет об ошибках, отсылая его также в почтовый список рассылки MySQL, чтобы специалисты могли помочь решить вашу проблему.
  • MySQLImport - импортирует данные из файла с разделителями в базу данных.
  • MySQLShow - показывает структуру баз данных и таблиц, из которых они состоят.

Хочу заострить внимание читателя вот на чем: сейчас появились программы, работающие через CGI-интерфейс, которые предоставляют практически полный пакет услуг администрирования баз данных. Эти программы лежат на Web-серверах и представляют собой обычные CGI-скрипты. Очень часто эти скрипты размещаются в доступных для общего пользования каталогах. Опасность заключается в том, что с помощью поисковых машин любой может найти такие программы по имени файла, а потом сделать с вашей базой данных все, что его душе угодно. Эту проблему легко обойти, если размещать эти скрипты в закрытых паролем каталогах сервера. Но лучшее решение - вообще отказаться от использования таких программ на сервере.

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

SELECT title, LENGTH(title) FROM table

В результате получим две колонки, где одна взята из таблицы, а вторая была вычислена.

Во-вторых, функцию можно использовать как составляющую предложения WHERE - в данном случае она заменит собой константу в момент выполнения запроса. Поясню на примере: необходимо найти события, которые произошли более суток назад.

SELECT event FROM table WHERE time>(Unix_TIMESTAMP()-(60*60*24))

Здесь функция Unix_TIMESTAMP() вычисляет текущее время, от которого мы отнимаем одни сутки.

Применение

По мнению автора, самая подходящая для MySQL сфера применения - это Интернет, благодаря хорошей системе безопасности этого пакета, стабильной работе и высокому быстродействию. Если вашему Интернет-проекту будет не хватать транзакций, можно использовать Postgres. Postgres во многом схож с MySQL, практически не уступает ему в производительности, но имеет больше функциональных возможностей. Впрочем, как показывает опыт, возможностей MySQL для несложных Интернет-проектов вполне достаточно.

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

Возможность работы нескольких пользователей. Это очевидное требование следует дополнить тем, что интенсивность использования базы данных в данном случае будет значительно выше, чем на Web-сервере. В самом деле, для сайта 20 посетителей одновременно считается большим успехом, а в случае корпоративной базы таким показателем может похвастаться даже небольшая фирма. Особое внимание надо обратить на то обстоятельство, что корпоративная база данных использует более сложные пользовательские интерфейсы, чем странички на сайте; иными словами, более интенсивно посылает запросы на сервер. В техническом плане это означает, что нужна блокировка на уровне изменяемой записи. Здесь MySQL показывает себя не лучшим образом: блокировка в нем осуществляется на уровне таблиц. Это означает, в частности, что если кто-то вводит заказ, то всем запросам (анализирующим статистику, выбирающим записи для отчета и т.п.) придется ждать, пока ввод заказа закончится. В случае корпоративной базы данных это сводит на нет даже такое преимущество MySQL, как быстродействие.

Контроль целостности данных на уровне SQL-сервера. Корпоративная база данных отличается сложной схемой данных, и поддерживать целостность данных средствами клиентской программы очень трудно: одна реляция может соединять пять-семь таблиц, а число таблиц может достигать 30--40. И в этом случае существенной становится отсутствующая у MySQL возможность каскадного обновления и удаления записей в связанных таблицах.

Кроме того, мы уже упоминали, что корпоративная база данных использует более сложный интерфейс, а это обстоятельство порождает еще два требования: поддержку всех стандартных инструкций SQL (и полезных расширений), а также использование сохраненных процедур (stored procedure) и триггеров. Увы, и здесь MySQL нас не радует.

Суммируя все сказанное, можно сделать вывод, что для большинства Интернет-проектов возможностей СУБД MySQL вполне достаточно. Их будет достаточно и для хранения адресной книги во внутренней сети предприятия.