|
позволяет производить большой объем обработки данных на сервере до их
извлечения. Но этой мощью нужно пользоваться с большой осторожностью. Хотя
может показаться, что перенос максимального объема обработки на сервер базы
данных дает выигрыш в производительности, на самом деле это не так. Ваше
приложение-клиент обслуживает потребности отдельного клиента, в то время как
сервер совместно используется многими клиентами. Из-за большого объема работы,
который должен производить сервер, почти всегда более эффективно возложить на
сервер минимально возможную нагрузку. MySQL и mSQL, возможно, наиболее быстрые
из имеющихся баз данных, но не нужно использовать эту скорость для той работы,
к которой лучше приспособлено клиентское приложение.
Если вам известно, что много клиентов будет запрашивать одни и те же итоговые
данные (например, данные по некоторому званию в нашем предыдущем примере),
создайте новую таблицу с этими данными и обновляйте ее при изменении данных в
исходной таблице. Эта операция аналогична буферизации и является
распространенным приемом в программировании баз данных.
Расширения языка
Как MySQL, так и mSQL обладают некоторыми витиеватыми расширениями, аналогов
которым вы не найдете в других базах данных. Большинство расширений, имеющихся
в MySQL, в целом согласуется со стандартом ANSI SQL. Расширения mSQL связаны
просто с особыми переменными, к которым можно обращаться при работе с базой
данных mSQL.
Возможности MySQL
MySQL превосходит mSQL в поддержке SQL, предоставляя возможность работы с
функциями и в некоторой мере — с внешними объединениями. Функции в SQL
аналогичны функциям в других языках программирования, таких как С и Perl.
Функция может принимать аргументы и возвращает некоторое значение. Например,
функция SQRT(16) возвращает 4. В MySQL в команде SELECT функции могут
использоваться в двух местах:
Как извлекаемая величина
В этом случае функция включается в список извлекаемых колонок. Возвращаемое
функцией значение, вычисляемое для каждой выбранной строки, включается в
возвращаемое результирующее множество, как если бы это была колонка базы данных.
Вот пример:
# Выбрать название каждого события (event), а также его дату
# в удобном для чтения формате из всех событий, более свежих,
# чем указанная дата. Функция FROM_UnixTIME()
# преобразует стандартное значение времени Unix
# в читаемый вид.
SELECT name, FROM_UnixTIME(date)
FROM events
WHERE time > 90534323
# Выбрать заглавие статьи, полный текст ее,
# и длину (в байтах) полного текста для всех
# статей, автор которых Stacie Sheldon.
# Функция LENGTHO возвращает длину заданной
# строки в символах.
SELECT title, text, LENGTH(text)
FROM papers
WHERE author = 'Stacie Sheldon'
Как часть предложения WHERE
В этом виде функция заменяет место константы при вычислении в предложении WHERE.
Значение функции используется при сравнении в каждой строке таблицы. Приведем
пример.
# Случайным образом выбрать название объекта из общего числа 35.
# Функция RAND() генерирует случайное число
# между 0 и 1 (умножается на 34, чтобы сделать его между 0
# и 34, и увеличивается на 1 , чтобы сделать его между 1 и
# 35). Функция ROUND() возвращает данное число округленным
# до ближайшего целого, что приводит к целому числу
# между 1 и 35, которое должно соответствовать одному
# из чисел ID в таблице.
SELECT name
FROM entries
WHERE id = ROUND( (RAND()*34) + 1 )
# Можно использовать функции одновременно в списке значений
# и предложении WHERE. В этом примере выбираются имя и дата
# всех событий, происшедших более суток назад. Функция UNIX_TIMESTAMP()
# без аргументов возвращает текущее время
# в формате Unix.
SELECT name, FROM_UnixTIME(date)
FROM events
WHERE time > (Unix_TIMESTAMP() - (60 * 60 * 24) )
# Функция может использовать значение поля таблицы.
# В этом примере возвращаются имена всех,
# кто использовал свое имя в качестве пароля. Функция ENCRYPTO
# возвращает зашифрованную в стиле пароля Unix
# заданную строку, используя 2-символьный ключ.
# Функция LEFT() возвращает п самых левых символов
# переданной строки.
SELECT name
|
|