Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основное / Письменные лекции по дисциплине «Базы данных»

.pdf
Скачиваний:
98
Добавлен:
29.01.2021
Размер:
939.56 Кб
Скачать

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

2.Операции индексирования полей таблиц БД должна быть проделана работа по анализу наиболее частых запросов к БД. Только в этом случае использование индексов позволит оптимизировать работу БД. Выявить наиболее медленные запросы к БД поможет slow log (сохраняет

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

3.Использование одного составного индекса вместо нескольких односоставных для ускорения наиболее активно использующихся запросов также ускорит скорость работы с БД.

4.Покрывающие индексы позволяют получать результат вообще без обращения к таблице БД. Иногда добавление дополнительного проиндексированного поля позволяет существенно сократить время обработки запросов.

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

6.В запросах, где используется LIKE %, индексы не используются,

даже если поле проиндексировано. Например, при таком запросе:

LIKE(SELECT Name FROM Persons WHERE Points LIKE '%10').

5.3.5. Создание индекса в MySQL

Для операции создания индекса MySQL предусматривает такой синтаксис:

CREATE [UNIQUE | FULLTEXT] INDEX <уникальное имя индекса>

ON <имя таблицы> (<имя столбца> [(length)],... )

где:

[UNIQUE | FULLTEXT] — определяет, будет ли индекс содержать только уникальные значения (UNIQUE), или в нем будут присутствовать и повторяющиеся значения (FULLTEXT). По умолчанию используется режим FULLTEXT. Length — определяет длину символов поля для индексирования. Если Length оставить пустым, то в индекс попадет поле целиком вне зависимости от длины.

<имя столбца> — уникальный идентификатор индекса. Если это поле не определено, ему будет присвоено имя первого подлежащего индексации столбца.

5.3.6. Типы индексов в MySQL

Первичный ключ (PRIMARY KEY) — это основной ключ, который в таблице может быть только один. Он позволяет идентифицировать уникальные записи в таблице. Значения, которые находятся в столбце, где поля имеют PRIMARY KEY, не могут повторяться. Нередко первичный ключ назначают для полей с идентификатором id.

Уникальный ключ (UNIQUE) — по сути, это альтернатива первичному ключу: значения, которые содержатся в таких полях также не могут повторяться и иметь значение NULL.

Составной индекс — позволяет включать в индекс несколько полей, по которым часто происходит выборка. Например, если в условиях часто фигурирует два параметра:

SELECT username FROM users WHERE city = '5' AND age > '18'

При использовании таких запросов составной индекс по полям city и age поможет ускорить выборку данных.

5.3.7. Удаление индекса в MySQL

В MySQL удалить индекс можно при помощи такого оператора:

DROP INDEX <Имя индекса> ON <Имя таблицы>

5.3.8.Преимущества использования индексов

очень быстрая выборка по первичному ключу;

эффективный поиск по интервалу первичного ключа;

быстрая сортировка по первичному ключу;

покрывающие индексы автоматически используют первичный ключ;

быстрая вставка в порядке сортировки первичного ключа.

5.3.9.Недостатки использования индексов

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

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

Достоинства от использования индексов значительно перевешивают небольшое количество недостатков. На больших и посещаемых проектах без использования индексов не обойтись.

5.3.10.Практический пример

Индекс создается по правилу:

create index название_индекса

on название_таблицы (название_столбца)

Например, у вас таблица называется test, где хранятся данные по городам России с улицами вида Город, Улица, Дом. Понятно, что строк в таблице при таком раскладе будет много. Если вы часто делаете выборку по определенному городу, например:

select * from test where city = 'Омск'

то, чтобы этот запрос отработал быстрее обычного, следует добавить индекс по вышеуказанному правилу:

create index city_index on test (city)

Тогда тот же самый запрос

select * from test where city = 'Омск'

отработает гораздо быстрее, если столбец city будет проиндексирован.

5.4. Курсор Курсор — это поименованная область в памяти базы данных.

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

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

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

Операторы управления курсором:

1.DECLARE — выполняет объявление явного курсора для отдельного оператора SELECT или для отдельной процедуры.

2.OPEN — открывает курсор, создавая новый результирующий набор на базе указанного запроса.

3. FETCH — выполняет последовательное извлечение строк из результирующего набора (в том числе передвигает указатель курсора вперед). Обычно это конструкция помещается в цикл, который прерывается по некоторому условию.

4. CLOSE — закрывает курсор и освобождает занимаемые им ресурсы.

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

Синтаксис объявления курсора:

DECLARE <имя курсора>

[SENSITIVE | INSENSITIVE | ASENSITIVE] [SCROLL | NO SCROLL] CURSOR

[ WITH HOLD | WITHOUT HOLD]

[ WITH RETURN | WITHOUT RETURN] FOR <выражение запроса SQL>

[ ORDER BY <выражение сортировки>]

[ FOR {READ ONLY | UPDATE [ OF <список столбцов>]}]

Основной частью объявления курсора является:

DECLARE <имя курсора> FOR <выражение sql-запроса>

Пример:

DECLARE cur_users CURSOR FOR SELECT id, name FROM users WHERE active = 'Alex';

Лекция 6. Администрирование баз данных

Резервирование и восстановление вручную

Команды GRANT и REVOKE;

Утилита mysqldump;

Утилита mysqlhotcopy;

Утилита mysqlcheck.

6.1. Резервирование и восстановление вручную

Поскольку таблицы MySQL хранятся в виде файлов, то резервное копирование выполняется легко. Чтобы резервная копия была согласованной, нужно выполнить на выбранных таблицах LOCK TABLES, а

затем FLUSH TABLES. При этом требуется блокировка только на чтение; поэтому другие потоки смогут продолжать запросы на таблицах в то время, пока будут создаваться копии файлов из каталога базы данных. Команда FLUSH TABLE обеспечивает гарантию того, что все активные индексные страницы будут записаны на диск прежде, чем начнется резервное копирование.

Синтаксис LOCK TABLES:

LOCK TABLES tbl_name {READ [LOCAL] | [LOW_PRIORITY] WRITE} [, tbl_name {READ [LOCAL] | [LOW_PRIORITY] WRITE} ...]

...

UNLOCK TABLES

Различие между READ LOCAL и READ состоит в том, что READ LOCAL

позволяет выполнять неконфликтующие команды INSERT во время существования блокировки.

Можно использовать блокировки LOW_PRIORITY WRITE, позволяющие другим потокам получать блокировки READ в то время, как основной поток находится в состоянии ожидания блокировки WRITE.

Пример LOCK TABLES:

// Блокировка table1 на чтение и table2 на запись

LOCK TABLES table1 READ, table2 WRITE;

// Какие-либо действия

UNLOCK TABLES; // Разблокировка

Т. е. никакой другой поток управления не может обновить таблицу table1 с блокировкой READ или прочитать таблицу table2 с блокировкой WRITE.

Синтаксис FLUSH:

FLUSH flush_option [,flush_option] ...

Примеры FLUSH:

FLUSH TABLES — закрываются все открытые таблицы и принудительно закрываются все используемые таблицы. Также сбрасывается кэш запросов.

FLUSH [TABLE | TABLES] tbl_name [,tbl_name...]

производится сброс только указанных таблиц.

FLUSH TABLES WITH READ LOCK — блокировать все таблицы во всех базах данных блокировкой READ.

Рабочий пример:

mysql> LOCK TABLES trans READ, customer WRITE;

 

 

mysql>

SELECT

SUM(value)

FROM

trans

WHERE

customer_id=some_id;

 

 

 

 

mysql>

 

UPDATE

customer

 

SET

total_value=sum_from_previous_statement

 

 

 

WHERE customer_id=some_id; mysql> UNLOCK TABLES;

Без использования LOCK TABLES существует вероятность того, что какой-либо иной поток управления может вставить новую строку в таблицу trans между выполнением операций SELECT и UPDATE.

Если есть необходимость провести резервное копирование на уровне

SQL, то можно воспользоваться SELECT ... INTO OUTFILE или BACKUP TABLE:

Оператор SELECT может быть представлен в форме SELECT ...

INTO OUTFILE 'file_name'. Эта разновидность команды SELECT

осуществляет запись выбранных строк в файл, указанный в file_name. Данный файл создается на сервере и до этого не должен

существовать (таким образом, предотвращается разрушение таблиц и файлов). Форма SELECT ... INTO OUTFILE главным образом предназначена для выполнения очень быстрого дампа таблицы на серверном компьютере.

BACKUP TABLE tbl_name[,tbl_name...] TO '/path/to/backup/directory' — копирует в каталог резервного

копирования тот минимум табличных файлов, который достаточен для восстановления таблицы, после сброса на диск всех изменений. Работает только для таблиц MyISAM. В процессе резервного копирования будет установлена блокировка чтения отдельно для каждой таблицы на время ее копирования. Если необходимо сделать резервное копирование в виде мгновенного образа нескольких таблиц, необходимо сначала запросить LOCK TABLES установки блокировки чтения для каждой таблицы в группе.

Восстановление:

LOAD DATA INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE table1 — читает строки из текстового файла file_name.txt и вставляет их в таблицу table1. Команда LOAD DATA INFILE

является дополнительной к SELECT ... INTO OUTFILE.

RESTORE TABLE tbl_name [,tbl_name...] FROM '/path/to/backup/directory' — восстанавливает таблицу(ы) из

резервной копии, созданной с помощью BACKUP TABLE. Существующие таблицы не перезаписываются: при попытке восстановления поверх существующей таблицы будет выдана

ошибка. Восстановление занимает больше времени, нежели BACKUP

— из-за необходимости повторного построения индекса. Чем больше в таблице будет ключей, тем больше времени заберет реконструкция. Эта команда, так же как и BACKUP TABLE, в настоящее время работает только для таблиц MyISAM.

6.2. Команды GRANT и REVOKE

GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]

ON {tbl_name | * | *.* | db_name.*}

TO user_name [IDENTIFIED BY [PASSWORD] 'password'] [, user_name [IDENTIFIED BY 'password'] ...]

[REQUIRE [{SSL| X509}]

[CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]]

[WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # | MAX_UPDATES_PER_HOUR # | MAX_CONNECTIONS_PER_HOUR #]]

REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]

ON {tbl_name | * | *.* | db_name.*}

FROM user_name [, user_name ...]

GRANT включен в MySQL начиная с версии 3.22.11 и выше. В более ранних версиях MySQL оператор GRANT ничего не выполняет.

Команды GRANT и REVOKE позволяют системным администраторам создавать пользователей MySQL, а также предоставлять права пользователям или лишать их прав на четырех уровнях привилегий:

1. Глобальный уровень. Глобальные привилегии применяются ко всем базам данных на указанном сервере. Эти привилегии хранятся в таблице mysql.user.

2.Уровень базы данных. Привилегии базы данных применяются ко всем таблицам указанной базы данных. Эти привилегии хранятся в таблицах mysql.db и mysql.host.

3.Уровень таблицы. Привилегии таблицы применяются ко всем столбцам указанной таблицы. Эти привилегии хранятся в таблице

mysql.tables_priv.

4. Уровень столбца. Привилегии столбца применяются к отдельным столбцам указанной таблицы. Эти привилегии хранятся в таблице

mysql.columns_priv.

Если привилегии предоставляются пользователю, которого не существует, то этот пользователь создается.

В таблице приведен список возможных значений параметра priv_type для операторов GRANT и REVOKE:

ALL

Задает все простые привилегии, кроме

 

WITH GRANT

[PRIVILEGES]

OPTION

 

 

ALTER

Разрешает использование ALTER TABLE

 

 

CREATE

Разрешает использование

 

CREATE TABLE

CREATE

Разрешает использование

TEMPORARY

CREATE TEMPORARY TABLE

 

TABLES

 

 

 

DELETE

Разрешает использование

 

DELETE

DROP

Разрешает использование

 

DROP TABLE

EXECUTE

Разрешает пользователю запускать хранимые

 

процедуры (для MySQL 5.0)

 

 

FILE

Разрешает использование

 

SELECT ... INTO OUTFILE

 

и LOAD DATA INFILE

INDEX

Разрешает использование

 

CREATE INDEX and DROP

 

INDEX