Приднестровская поддержка XOOPS
Для определения эффективности SQL-запроса используется оператор EXPLAIN. Оператор имеет следующий формат:
EXPLAIN <Имя таблицы>;
EXPLAIN <Запрос SELECT>;
Первый вариант выведет структуру указанной таблицы, а второй вариант позволяет выяснить, каким образом выполняется запрос с помощью SQL-команды SELECT. В качестве примера выведем результат поиска клиента по его полному имени. SQL-команду будем выполнять с помощью программы MySQL monitor. Для запуска программы в меню Пуск выбираем пункт Программы | MySQL | MySQL server 5.1 | MySQL Command Line Client. Откроется черное окошко с запросом ввести пароль. Вводим пароль, заданный при установке сервера MySQL. Если установка производилась по инструкциям, то пароль "123456". В случае успешного входа отобразится приветствие сервера, и программа перейдет в режим ожидания команд. В командной строке будет приглашение:
mysql>
Далее необходимо выбрать базу данных с помощью команды:
USE tests;
Теперь в командной строке набираем команду:
EXPLAIN SELECT * FROM `Customers` WHERE `Name`='Иванов Иван Иванович';
Эта команда вернет такой результат:
table: Customers
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 3
Extra: Using where
Рассмотрим результат выполнения оператора EXPLAIN. Строка table содержит название таблицы. Значение строки type показывает эффективность выполнения запроса. Может принимать значения ALL, index, range, ref, eq_ref, const (или system). Перечисленные значения расположены по возрастанию степени эффективности запроса. Значение ALL означает, что просматриваются все записи таблицы. Это самый неэффективный способ. Количество просматриваемых записей указывается в строке rows. Чем меньше это число, тем эффективнее запрос. Строка possible_keys содержит список всех доступных ключей или значение NULL в случае отсутствия ключей. В строке key указано название используемого индекса, а строка key_len содержит длину используемого ключа. Поля, которые дополнительно использовались для выборки, указываются в строке ref. Последняя строка Extra обычно содержит дополнительную информацию о выполнении запроса.
Как видно из приведенного примера, для выполнения запроса пришлось просматривать все записи таблицы Customers, так как записи в неиндексированных полях таблицы расположены в произвольном порядке. Для ускорения выполнения запросов применяются индексы (ключи). Индексированные поля всегда поддерживаются в отсортированном состоянии, что позволяет быстро найти необходимую запись, не просматривая все записи. Неиндексированное поле можно сравнить с книгой без предметного указателя, а индексированное поле — с книгой, где он присутствует. Чтобы найти что-либо в первом случае, необходимо последовательно перелистывать страницы книги. Во втором случае достаточно найти нужное понятие по алфавиту в предметном указателе, а затем сразу перейти на указанную страницу. Необходимо сразу заметить, что применение индексов приводит к увеличению размера базы данных, а также к затратам времени на поддержание индекса в отсортированном состоянии при каждом добавлении данных. По этой причине индексировать следует поля, которые очень часто используются в запросах типа
SELECT <Список полей> FROM <Таблица> WHERE <Поле>=<Значение>;
Существуют следующие виды индексов:
□ первичный ключ;
□ уникальный индекс;
□ обычный индекс;
□ индекс FULLTEXT.
Первичный ключ служит для однозначной идентификации каждой записи в таблице. Для создания индекса используется ключевое слово PRIMARY KEY.
При создании таблицы ключевое слово можно указать после определения параметров поля
CREATE TABLE `City` (
`id_City` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`City` CHAR(50) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
или после перечисления всех полей
CREATE TABLE `City` (
`id_City` INT NOT NULL AUTO_INCREMENT,
`City` CHAR(50) NOT NULL,
PRIMARY KEY (`id_City`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Вторым способом можно создать первичный ключ, состоящий из нескольких полей (надо перечислить их в скобках через запятую):
PRIMARY KEY (`id_Orders`, `id_Tovar`)
Добавить первичный ключ в существующую таблицу позволяет SQL-команда:
ALTER TABLE <Таблица> ADD PRIMARY KEY (<Поле>);
Удалить первичный ключ позволяет SQL-команда:
ALTER TABLE <Таблица> DROP PRIMARY KEY;
В одной таблице не может быть более одного первичного ключа. А вот обычных и уникальных индексов в таблице может быть несколько. Создать индекс можно при определении структуры таблицы с помощью ключевых слов INDEX и KEY (UNIQUE INDEX и UNIQUE KEY для уникального индекса):
CREATE TABLE `Customers` (
`id_Customer` INT NOT NULL AUTO_INCREMENT,
`Name` CHAR(50) NOT NULL,
`Address` CHAR(255) NOT NULL,
`id_City` INT NOT NULL,
`Phone` CHAR(30),
PRIMARY KEY (`id_Customer`),
KEY MyIndex (`Name`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Индекс может иметь название. Но так как название индекса не указывается в SQL-запросе, то чаще всего названием индекса служит имя поля. Сервер MySQL самостоятельно решает, каким индексом лучше воспользоваться в каждой конкретной ситуации. Знать название индекса необходимо для его удаления из таблицы.
При индексировании текстовых полей следует указать количество символов (до 1000 символов), подлежащих индексации:
KEY MyIndex (Name(10)) (1)
Создать обычный индекс позволяют SQL-команды
CREATE INDEX <Имя индекса> ON <Таблица> (<Поле>(<Количество символов>));
или
ALTER TABLE <Таблица>
ADD INDEX <Имя индекса> (<Поле>(<Количество символов>));
Создать уникальный индекс позволяют SQL-команды
CREATE UNIQUE INDEX <Имя индекса>
ON <Таблица> (<Поле>(<Количество символов>));
или
ALTER TABLE <Таблица>
ADD UNIQUE INDEX <Имя индекса> (<Поле>(<Количество символов>));
Удалить обычный и уникальный индексы позволяют SQL-команды
DROP INDEX <Имя индекса> ON <Таблица>;
или
ALTER TABLE <Таблица> DROP INDEX <Имя индекса>;
В качестве примера создадим индекс для поля Name таблицы Customers:
CREATE INDEX `Name` ON `Customers` (`Name`(5));
А теперь сделаем запрос и проверим его эффективность с помощью оператора EXPLAIN:
EXPLAIN SELECT * FROM `Customers` WHERE `Name`='Иванов Иван Иванович';
Эта команда SQL выведет
table: Customers
type: ref
possible_keys: Name
key: Name
key_len: 5
ref: const
rows: 1
Extra: Using where
Сравните результат запроса с индексом и предыдущий пример без индекса.
Обратите внимание, значение строки type уже не равно ALL, а количество просмотренных записей равно 1. Это означает, что индекс полностью задействован.
Индекс FULLTEXT применяется для полнотекстового поиска. Реализацию полнотекстового поиска и способы создания индекса FULLTEXT мы подробно рассмотрим в разд. 10.
Получить полную информацию об индексах таблицы позволяет SQL-команда:
SHOW INDEX FROM <Таблица> [FROM <База данных>];
Например, команда
SHOW INDEX FROM `Customers`\G
выведет
*************************** 1. row ***************************
Table: Customers
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id_Customer
Collation: A
Cardinality: 3
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
*************************** 2. row ***************************
Table: Customers
Non_unique: 1
Key_name: Name
Seq_in_index: 1
Column_name: Name
Collation: A
Cardinality: NULL
Sub_part: 5
Packed: NULL
Null:
Index_type: BTREE
Comment:
Строка Collation показывает способ сортировки (A — по возрастанию, D — по убыванию, NULL — без сортировки), строка Cardinality позволяет узнать количество элементов в индексе, а строка Index_type информирует о методе индексации.
Обратите внимание, в качестве значения строки Cardinality для индекса Name мы получили значение NULL. Может показаться, что в индексе нет элементов. Чтобы получить количество элементов, необходимо перед использованием оператора SHOW INDEX выполнить SQL-команду:
ANALYZE TABLE <Таблица>;
Отправитель | Нити |
---|
12 пользователь(ей) активно (1 пользователь(ей) просматривают Инструкции)
Участников: 0 Гостей: 12 далее... |