Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MySQL. Библиотека профессионала - Аткинсон Л

..pdf
Скачиваний:
167
Добавлен:
24.05.2014
Размер:
10.41 Mб
Скачать

502 Глава 28. Перенос данных в разные СУБД

Oracle

MySQL

Получение следующего зна Получение следующего значения чения * UPDATE invoice_seq

SET LAST_IN

SELECT

SELECT LAST INSERT

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

При работе с утилитой подчиненный запрос можно сымитировать, создав файл сценария с текстом запроса. Представим себе таблицу, в которой хранятся со общения интерактивного форума. Раз в месяц старые сообщения переносятся в архив и удаляются из главной таблицы. Таблица archive содержит идентификаторы всех записей таблицы message, которые сохраняются в архивном файле. Чтобы получить список удаляемых нужно извлечь их идентификаторы из таблицы archive. В листинге 28.3 демонстрируется удаление записей таблицы message, соот ветствующих записям таблицы archive. Сначала с помощью функции CONCAT соз дается группа инструкций, содержащих идентификаторы сообщений. В результате формируется таблица, состоящая из одного столбца. Затем благодаря предложению INTO OUTFILE этатаблица сохраняется в файле Таким образом, будет получен SQL сценарий, содержащий одну инструкцию в каждой строке. В конец каждой строки добавляется точка с запятой. Сценарий загружается с помощью ко манды source, которая является частью интерпретатора mysql. Она загружает ука занный файл и последовательно выполняет содержащиеся в нем инструкции, как ес ли бы они были набраны в командной строке. При взаимодействии с сервером про граммным путем этот этап необходимо реализовать самостоятельно.

Сохранение таблицы в текстовом

SELECT

FROM message WHERE

FROM

archive

INTO

OUTFILE

Загрузка и выполнение файла инструкций. source

Некоторые СУБД позволяют непосредственно управлять указателями наборов за писей. Такие указатели можно перемещать с помощью инструкций SQL. В MySQL ука затели используются самой программой и недоступны на уровне инструкций. В то же время результаты запроса можно извлекать построчно с помощью функций библио теки языка С.

Устранение 503

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

С хранимыми процедурами связана и концепция триггеров. СУБД выполняет процедуры при наступлении определенных событий. Это позволяет на кладывать на таблицу произвольные ограничения целостности. Как правило, это кас

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

CREATE TABLE member

ID

NOT NULL

Name

NOT NULL,

Department

 

PRIMARY

NOT

 

ВMySQL распознаются инструкции CREATE TABLE, содержащие определения

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

Представление — это инструкция SELECT, которая получила имя и выглядит как таблица. Представления необходимы для того, чтобы заставить пользователей обра щаться к некоторым таблицам строго определенным образом и без возможности новления. Планируется, что представления появятся в MySQL ве рсии 4.1, а пока что запрет записи в таблицу реализуется только посредством привилегий.

Некоторые СУБД используют фиксированный порядок сортировки записей, а в дру гих СУБД этот порядок указывается перед созданием базы данных. MySQL не учитывает регистр символов в операциях сравнения, но эту установку можно отменить, задав в оп ределении столбца флаг BINARY. Существует также оператор приведения типа BINARY, описанный в главе 12, "Встроенные функции". Порядок сортировки двоичных строк определяется используемым набором символов. По умолчанию это

ВMySQL существуют операторы REGEXP и NOT REGEXP, позволяющие сравнивать

строку с регулярным выражением. Некоторые СУБД разрешают указывать ные выражения в операторе LIKE, но в MySQL концепция регулярных выражений реализована в полном объеме.

504 Глава 28. Перенос данных в разные СУБД

ИспользованиережимаANSI

Демон

имеет опцию командной строки

позволяющую включить

режим ANSI. В этом режиме поведение программы несколько меняется с целью улуч

шения совместимости со стандартом

Ниже перечислены отличительные осо

бенности режимаANSI.

 

 

 

Две вертикальные черты

теперь представляют собой оператор конкатенации

строк, а не оператор логического сложения. Обычно для совместимости с другими СУБД приходится пользоваться функцией CONCAT

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

В режиме ANSI строковые литералы разрешается заключать только в одинарные кавычки. Обычно MySQL разрешает использовать двойные кавычки, но стандарт требует, чтобы в такие кавычки брались только идентификаторы с пробелами. На пример, если таблица называется my table, то ее имя нужно заключать в кавычки, иначе оно будет воспринято как два разных имени. В обычном режиме такие имена берутся в обратные кавы чки.

Тип REAL в MySQL обычно преобразуется в тип DOUBLE. Однако в режиме ANSI ему соответствует тип FLOAT.

Стандартным уровнем изоляции транзакций в режиме ANSI является уровень SERIALIZABLE (см. главу 9,"Транзакции и параллельныевычисления").

Уникальныесвойства MySQL

Подобно всем реляционным СУБД, MySQL содержит целый ряд расширений стандарта SQL. Если в будущем планируется переход на другую СУБД, постарайтесь не задействовать эти расширения. я придерживаюсь противоположного принципа: использовать что возможно. Большинство расширений обеспечивает повышение производительности, что иногда приводит к отказу от перехода на якобы более мощную СУБД. Кроме того, некоторые приложения имеют короткое время жизни. Это особенно справедливо в отношении Web приложений. Их универсализа ция бесполезна, если их вс е равно придется писать заново.

В MySQL поддерживаются комментарии особого вида, позволяющие скрывать код от других СУБД. Такие комментарии записываются в стиле языка С, но текст коммента рия начинается с восклицательного знака. Программа MySQLраспознает код, ченный в такие комментарии, тогда как другие СУБД игнорируют их. После знака можно указать минимально допустимый номер версии MySQL. Таким способом чаются "спорные" фрагменты инструкций. В листинге 28.5 приведена инструкция, которые фрагменты которой выходят за рамки стандарта SQL. В последней строке держится требование, чтобы таблица создавалась только в MySQL версии 3.23 или выше. Можно указывать более точный номер версии, например 32335 (т.е. 3.23.35).

Уникальные свойства MySQL 505

CREATE TABLE

IF NOT EXISTS

player

 

Столбцы

 

 

 

ID

UNSIGNED

NOT NULL

AUTO_INCREMENT

Nickname

NOT NULL,

 

 

Password

NOT NULL,

 

 

Rank

NOT NULL

DEFAULT

 

PRIMARY KEY

(ID)

 

 

TYPE=MyISAM

Программа MySQL придерживается правил операционной системы в отношении чувствительности к регистру имен баз данных и таблиц. В Windows регистр не важен, а в UNIX— важен. Большинство СУБД придерживается первого варианта. Имена столбцов в MySQL тоже нечувствительны к регистру. Правда, в сравнении с другими СУБД, MySQL допускает гибкость. К примеру, разрешаются имена, начи нающиеся с цифр, а максимальная длина имен обычно больше, чем в других СУБД.

Все СУБД создают базы данных, поэтому о длине имен баз данных можно не беспокоиться. Инструкция CREATE DATABASE в MySQL не является частью та. Что касается длины имен таблиц и столбцов, то многие СУБД ограничивают ее три дцатью двумя символами. Желательно не выходить за рамки этого ограничения, иначе при переносе базы данных придется переименовывать ее объекты. Убедитесь также, что никакие две базы данных или дветаблицы одной базы данных не названы во, за исключением регистра символов, например и

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

вида

Реляционные СУБД

расширяют это требование.

MySQL позволяет добавлять слева имя базы данных:

столбец.

В соответствующем контексте можно ссылаться на имя таблицы, перед которым стоит имя базы данных. Чтобы избежать проблем с другими СУБД, старайтесь придерживать сястандарта.

В стандарте SQL одинарная кавычка защищается от интерпретации удвоением В MySQL для этой цели можно использовать символ \. О защите специальных

символов рассказывалось в главе 9, "Транзакции и параллельные вычисления". ки можно заключать в одинарные или двойные кавычки.

ВMySQL операторы | | и & обозначают операции логического сложения и умно жения соответственно. Вместо них всегда можно использовать ключевые слова OR и AND. В стандарте SQL оператор | | обозначает конкатенацию строк. Если забыть об этом, то при переносе базы данных в другую СУБД могут возникнуть трудно обнару живаемые ошибки.

ВMySQL поддерживается оператор который эквивалентен функции MOD

Всписке возвращаемых столбцов инструкции SELECT можно использовать опера торы сравнения, в главе 10, "Типы данных, переменные и выражения".

Результатом сравнения будет нуль или единица, в зависимости от является вы ражение истинным или ложным.

Стандартный способ присваивания переменных заключается в использовании ин струкции SET. В MySQL разрешается также задавать значения переменных в списке возвращаемых столбцов инструкции SELECT. Для этого предназначен оператор

506 Глава 28. Перенос данныхвразные СУБД

Операторы NOT REGEXP и NOT позволяют сравнивать зна чение с регулярным выражением. В некоторых СУБД для этих целей расширены воз можности оператора

MySQL разрешает применять оператор LIKE к любым столбцам, даже числовым. Перед сравнением с шаблоном числовые значения приводятся к строковому типу.

Например, можно записать LIKE 2%

чтобы найти целые числа, начинающиеся с

цифры 2.

 

В MySQL есть функция

возвращающая последнее значение

Если первичный ключ является целым числом, на него всегда можно сослаться по специальному имени _rowid. Если же первичного к люча нет, этому имени соответствует столбец типа UNIQUE, при условии, что таковой имеется.

В стандарте SQL определено, что функция CONCAT принимает два аргумента. В тех СУБД, которые соответствуют этой части стандарта, нужно использовать женные вызовы функции при объединении группы строк. MySQL не ограничивает число аргументов данной функции. Функция CHAR тоже имеет произвольное число аргументов.

Помимо описанных выше функций в MySQL поддерживаются следующие нестан

дартные функции:

 

 

FORMAT

FROM_DAYS

MD5

 

 

и

В MySQL есть несколько нестандартных типов столбцов. Типы ENUM и SET ляют определить диапазон допустимых значений столбца. Поддерживаются также производные типы, расширяющие наоборот, сокращающие размерность стан дартного типа данных. Например, значение типа MEDIUMINT занимает три байта вме сто четырех, а тип LONGBLOB поддерживает строки длиной до 4 Гбайт.

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

При обсуждении инструкции CREATE TABLE в главе 13, "Инструкции SQL", рас сказывалось о том, каким образом программа MySQL меняет определения столбцов. В таблицах с динамическими записями столбцы CHAR превратятся в VARCHAR, если их размерность составляет более четырех символов. И наоборот, более короткие столб цы типа VARCHAR будут приведены к типу CHAR в целях экономии места на диске.

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

Oracle для этих целей применяются последовательности, которые можно вать с помощью таблицы, состоящей из одной ячейки.

Влистинге 28.6 демонстрируется универсальный способ создания последователь ности при помощи механизма транзакций. Это не самый эффективный способ полу чения уникальных идентификаторов в MySQL, но он должен работать в тех СУБД, где

поддерживаются транзакции. Стандартный тип несовместим с транзакциями, поэтому в примере создается таблица Berkeley DB. ность начинается с нуля.

Уникальные свойства MySQL 507

Создание

CREATE TABLE invoice_seq

INT

INSERT INTO invoice_seq VALUES

Получение следующего

SET TRANSACTION ISOLATION LEVEL

BEGIN;

UPDATE invoice_seq

SET nextval

SELECT nextval

FROM

COMMIT;

Инструкция SET TRANSACTION подчеркивает необходимость в дан ной методике. В рамках единой транзакции сценарий увеличивает порядковый номер и тут же запрашивает его. Если все потоки будут придерживаться такой можно будет использовать идентификаторы, не опасаясь того, что какой то из них встретится

Столбцы, не помеченные флагом NOT NULL, могут содержать значения NULL. В MySQL можно также использовать флаг NULL, чего нет в стандарте. Флаги UNSIGNED и ZEROFILL тоже являются расширениями стандарта. Первый из них мо дифицирует диапазон возможных значений столбца за счет знакового разряда. На пример, столбец SMALLINT допускает значения от 32768 до 32767, а столбец UNSIGNED SMALLINT— от 0 до 65535. Значения, выходящие за границы знакового диапазона, могут отвергаться или неправильно интерпретироваться другими СУБД.

MySQL разрешает указывать флаг DISTINCT статистической функции COUNT Например, запрос, показанный в листинге 28.7, является допустимым. Дру гие СУБД могут не понимать такой синтаксис.

SELECT Producer, Contact)

FROM project;

В MySQL разрешается определять произвольное число индексов в инструкции CREATE TABLE, тогда как в стандарте допускаются только первичный и внешние ключи. Другие СУБД требуют, чтобы индексы создавались отдельно с помощью инст рукции CREATE INDEX. В MySQL индексы могут быть именованными. Можно индек сировать фрагменты столбцов, начиная с самого левого символа. Это называется час тичными индексами. Поддерживаются также полнотекстовые индексы столбцов BLOB и TEXT.

ЕСЛИ В инструкции CREATE TABLE присутствует флаг TEMPORARY, программа MySQL создаст временную таблицу, которая будет уничтожена по окончании сеанса. В других СУБД применяется иной синтаксис работы с временными таблицами.

508 Глава 28. Перенос данных в разные СУБД

При наличии флага IF NOT EXISTS инструкция CREATE TABLE не будет созда вать таблицу, если она уже существует. У инструкции DROP TABLE есть похожий флаг IF EXISTS. В отличие от других СУБД, MySQL разрешает удалять несколько таблиц в однойинструкции.

ВMySQL у инструкции SELECT есть предложение INTO OUTFILE, позволяющее сохранять результаты запроса в файле. Инструкция LOAD DATA INFILE загружает данные из файла в таблицу.

Вдругих СУБД столбец, указанный в предложении GROUP BY, должен входить в таблицу результатов запроса. В MySQL данное ограничение отсутствует. В предложе нии GROUP BY допускаются флаги и DESC.

Флаг STRAIGHT_JOIN заставляет программу выполнить объединение таблиц в ука

занном порядке. В Oracle пользователи могут включать в комментарии подсказки для модуля оптимизации,служащие аналогичнымцелям.ИнструкцияEXPLAIN возвращает информацию о том, как именно выполняетсяобъединение. На основании этого можно делать выводы о необходимости добавления индексов (см. главу 26,

Возможности модификации таблиц в MySQL заметно превосходят возможности других СУБД. К примеру, многие СУБД позволяют добавлять столбцы, но не разре шают удалять их или менять их определения. В MySQL все это возможно. Если изме нение затрагивает существующие значения, программа попытается их преобразовать. Инструкция RENAME TABLE непосредственно меняет имя таблицы. Инструкция ALTER TABLEпозволяетвносить множественные измененияв определение таблицы.

Инструкция DELETE содержит предложение LIMIT, которое ограничивает коли чество удаляемых записей. Это позволяет эффективнее организовать многопользова тельскую работу с базой данных. На время выполнения инструкции DELETE таблица блокируется, поэтому большие объемы записей лучше удалять не целиком, а неболь шими "порциями", чтобы другие потоки не блокировались надолго.

Запросы на чтение и на запись заносятся в разные очереди, причем запросы на запись имеют более высокий приоритет. Эту установку можно отменить с помощью флага DELAYED инструкции INSERT, флага инструкции UPDATE или флага HIGH_PRIORITY инструкции SELECT.

Инструкция REPLACE является особой разновидностью инструкции INSERT. Она удаляет существующие записи, если значения их первичных ключей противоречат первичным ключам вставляемых записей. В результате пропадает необходимость в

Инструкции ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE и REPAIR TABLE позволяют контролировать таблицы и индексы и восстанавливать их в случае повре ждений.

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

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

Уникальные свойства MySQL 509

Для повышения производительности в MySQL применяются различные кэш буферы. Иногда приходится очищать их содержимое. Для этого предназначена рукция FLUSH.

Администраторы MySQLмогут создавать базы данных не с помощью специального интерфейса, а посредством инструкции CREATE DATABASE. Инструкция DROP DATABASE удаляет базуданных и все ее таблицы.

РАСПРЕДЕЛЕННЫЕ БАЗЫ ДАННЫХ

В этой главе...

Концепции распределенных баз данных Отложенная синхронизация Репликация в MySQL

Запуск нескольких серверов

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

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

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

Вэтой главе рассказывается также о том, как запустить несколько серверов MySQL на одном компьютере. Данная методика позволяет повысить безопасность серверов, которые работают в многопользовательском режиме.

Концепции распределенных баз данных

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

По мере возрастания нагрузки производительность сервера снижается. Чтобы из бежать этого, задействуют дополнительные ресурсы, например наращивают память, ставят дополнительные процессоры и даже сетевые платы. Это эффективная страте гия, если клиенты расположены в непосредственной близости от сервера, например несколько приложений взаимодействуют с одной СУБД. Но в тех турах, где сервер и клиенты удалены друг от друга, производительность обратно порциональна расстоянию.