Созданный для таблицы индекс сохраняется отдельно от этой таблицы. Главным назначением индекса является повышение скорости извлечения данных. Создание или удаление индексов на сами данные не влияет. Удаление индекса может лишь замедлять процесс получения данных. Для хранения индекса требуется физическая память и нередко индекс разрастается больше самой таблицы, для которой он был построен.
Принцип работы индексов
При создании индекса таблицы в него заносится информация о размещении данных того столбца, по которому происходит индексирование. Когда в таблицу добавляются записи, в индекс тоже заносятся соответствующие данные. При выполнении запроса, в котором либо в условии этого запроса, либо в выражении ключевого слова WHERE присутствует столбец, по которому выполнено индексирование, сначала происходит поиск в индексе. Если подходящее значение в индексе будет найдено, индекс возвратит точное местоположение нужных данных в таблице. На рис. 16.1 показано, как функционирует индекс.
Рассмотрим для примера следующий запрос.
SELECT *
FROM TABLE_NAME
WHERE NAME = 'SMITH';
Как показано на рис. 16.1, для ускорения поиска значений 'SMITH' в таблице используется индекс, построенный по значениям столбца NAME (фамилия). После того, как для фамилии места соответствующих записей в таблице определены, данные могут быть извлечены очень быстро. В индексе данные упорядочены по алфавиту - здесь, например, это касается фамилий.
В случае отсутствия индекса тот же самый запрос привел бы к полному сканированию таблицы, и значит, в поисках нужных данных (фамилии SMITH) была бы прочитана каждая строка таблицы.
Рис. 16.1. Доступ к таблице с помощью индекса
Команда CREATE INDEX
Форма оператора CREATE INDEX, как формы многих других операторов SQL, может варьироваться в зависимости от конкретной реализации языка. Многие реализации поддерживают следующий синтаксис оператора.
CREATE INDEX имя_индекса ON имя_таблицы
Очень большие отличия для различных реализаций языка наблюдаются в допустимых опциях оператора CREATE INDEX. Некоторые реализации SQL допускают опции управления памятью (как в операторе CREATE TABLE), опции упорядочения (DESC | ASC), а также использование кластеров. Чтобы выяснить корректный синтаксис, необходимо обратиться к документации по той конкретной реализации языка, которую вы используете.
Типы индексов
Для таблиц базы данных можно создать индексы нескольких типов, но все индексы служат одной цели - ускорению работы с базой данных посредством ускорения поиска данных. На этом уроке мы рассмотрим простые индексы (построенные по данным одного столбца), составные или композитные индексы (комбинирующие данные нескольких столбцов) и уникальные индексы.
В некоторых реализациях SQL индексы могут создаваться уже при создании таблицы. Большинство реализаций языка для создания индексов предлагает специальную команду, отличную от команды CREATE INDEX. Наличие или отсутствие специальной команды для создания индексов, как и ее синтаксис, можно уточнить по документации используемого вами языка.
Простые индексы
Индексирование по данным одного столбца таблицы является самым простым и, в то же время, наиболее часто используемым типом индексирования. Простой индекс - это индекс, создаваемый по данным одного столбца таблицы. Базовый синтаксис оператора для создания такого индекса выглядит следующим образом.
CREATE INDEX имя_индекса
ON имя_таблицы (имя_столбца)
Например, если необходимо создать индекс таблицы EMPLOYEE_TBL по фамилиям служащих, то это можно сделать с помощью следующей команды.
CREATE INDEX NAME_IDX
ON EMPLOYEEJTBL (LAST__NAME) ;
Следует внимательно отнестись к планированию таблиц и их индексов. Не думайте, что создав индекс, вы решите все проблемы производительности использования базы данных. Иногда индекс может не ускорять, а тормозить работу. Кроме того, индекс занимает дисковое пространство.
Использование простого индекса оказывается наиболее эффективным в том случае, когда соответствующий индексу столбец часто используется в условиях запросов в выражениях ключевого слова WHERE. Хорошими кандидатами для использования в индексах являются столбцы с табельными номерами, серийными номерами, или созданными системой порядковыми номерами (счетчиками)
Уникальные индексы
Уникальные индексы используются не только для ускорения поиска данных, но и для обеспечения их целостности. Наличие уникального индекса не позволит ввести в таблицу дубликаты записей. В то же время уникальный индекс работает точно так же, как и обычный. Синтаксис соответствующего оператора следующий.
CREATE UNIQUE INDEX имя_индекса
ON имя_таблицы (имя__столбца)
Например, чтобы создать уникальный индекс таблицы EMPLOYEE_TBL по фамилиям служащих (LAST_NAME), используйте следующую команду.
CREATE UNIQUE INDEX NAME__IDX
ON EMPLOYEEJTBL (LAST_NAME);
Единственной проблемой при создании уникального индекса является требование уникальности значений соответствующего столбца в таблице - требование, выполняющееся далеко не для всех столбцов. Но уникальный индекс можно создавать для столбцов типа идентификационного кода, поскольку такие номера очевидно уникальны для каждой персоны.
У вас может возникнуть вопрос: "А если идентификационный код не является в таблице ключом?" Индекс неявно создается при определении ключа таблицы. Но в конкретной компании данные могут обрабатываться по внутреннему табельному номеру, а идентификационные коды служащих использоваться только для документов, связанных с отчислениями по налогам. Тогда логичнее будет создать индекс по табельному номеру и обеспечить его уникальность.
Уникальный индекс можно создать только по тому столбцу таблицы, данные которого уникальны.
Составные индексы
Составной индекс - это индекс, составленный по значениям нескольких столбцов таблицы. При создании составного индекса уже следует учитывать вопросы производительности базы данных, поскольку в данном случае порядок столбцов в условии индекса может сильно влиять на скорость извлечения данных. Общее правило для повышения производительности таково: более ограничивающее значение должно идти первым. Однако первым должен указываться столбец, наличие которого всегда предполагается в условиях выбора. Синтаксис соответствующего оператора следующий.
CREATE INDEX имя_индекса
ON имя_таблицы (столбец1, столбец2)
Вот пример создания составного индекса.
CREATE INDEX ORD_IDX
ON ORDERS_TBL (CUST_ID, PROD_ID);
В этом примере создается составной индекс по значениям двух столбцов таблицы ORDERSJTBL - столбцов CUST_ID и PROD_ID. Предполагается, что значения этих столбцов будут часто одновременно использоваться в условиях ключевого слова WHERE в запросах.
Использование составного индекса оказывается наиболее эффективным в том случае, когда соответствующие индексу столбцы часто одновременно используются в условиях запросов в выражениях ключевого слова WHERE.
Простые и составные индексы
При решении вопроса о выборе типа создаваемого индекса примите во внимание ожидаемую частоту использования соответствующего столбца (или столбцов) в условиях запросов в выражениях ключевого слова WHERE. Если в условиях будет использоваться один столбец, следует выбрать простой индекс, а если предполагается часто использовать несколько столбцов одновременно, лучше построить составной индекс.
Неявные индексы
Неявные индексы - это индексы, создаваемые автоматически сервером базы данных при создании объектов. Например, автоматически создаются индексы для ключей и ограничений типа уникальности. Зачем создаются такие индексы? Представьте, что сервером базы данных являетесь вы. Пользователь добавляет в базу данных информацию о новом товаре. Код товара является ключом таблицы, и это значит, что код товара должен быть уникальным. Чтобы быстро проверить уникальность вводимого пользователем кода среди сотен или тысяч записей, коды товаров должны быть индексированы. Поэтому при создании ключа или задании условий уникальности для вас автоматически создается соответствующий индекс.
Когда следует создавать индекс?
Уникальные индексы используются неявно для работы с ключевыми полями. Внешние ключи тоже обычно неплохие кандидаты для использования в индексах, поскольку внешние ключи часто используются для связывания таблиц. Индексы должны использоваться для большинства столбцов, если не для всех, используемых для связывания таблиц.
Неплохо построить индексы и для тех столбцов, которые часто используются в выражениях ключевых слов ORDER BY и GROUP BY. Например, если вы используете сортировку по фамилиям служащих, неплохо иметь какой-нибудь индекс по столбцу с фамилиями. Это автоматически разместит фамилии по алфавиту (в индексе) и поэтому ускорит сортировку и вывод запрашиваемых данных.