Индексы это важная часть большинства серверов баз данных. Они позволяют ускорить доступ к данным. Суть индексов хорошо описывает следующий пример: оглавление книги, оно позволяет найти нужную нам страницу вместо перебора всех страниц. Но у индексов есть недостатки: они заполняют дополнительное место (бывают случаи что индексы занимают в 3 раза больше места чем сами данные), также замедляются операции изменения данных, так как теперь нам надо менять еще и индексы.
Что из себя представляет индекс?
Внутри сервера они представлены в виде B-tree, где B означает сбалансированное, а не бинарное дерево.
Например мы хотим найти запись с Id = 2581.
Начиная с корня, выполняется поиск наименьшего значения ключа, большего или равного требуемому. Так мы найдем узел 18316, потом спустимся в узел 9031 и там мы увидим что есть прямая ссылка на лежащие данные по ключу 2581, после чего осуществляем вычитку данных.
Кластерный индекс
Кластерный индекс позволяет определить порядок данных в таблице. Таким образом индекс содержит не только указатели на строки но и сами данных. Из этого выходит что у таблицы может быть только один кластерный индекс, так как нельзя физически упорядочить элементы более чем одним способом. Индекс создается автоматически для каждой таблицы, в которой определен первичный ключ.
Не кластерный индекс
Структура такая же как и кластерного индекса, но с двумя отличиями:
- Не изменяет физическое упорядочивание данных.
- Страницы индекса состоят из ключа индекса и ссылки на строку.
SQL Server использует индекс для нахождения записей, совпадающих с условиями запроса.
Составной ключ в индексе
SQL Server позволяет создавать индексы по нескольким колонкам. Но в таком случае у нас появляется ограничение. Длинна составного ключа не должна быть больше 900 байт. Но бывают исключения, например у нас есть две колонки, каждая из которых длинной в 500 байт. Сервер создаст индекс, в случае если нет данных, которые будут превышать длину в 900 байт.
Также стоит помнить что индексы типа (Col1, Col2) и (Col2, Col1) разные.
Уникальные индексы
Такие индексы создаются для реализации целостности данных. Таким образом сервер гарантирует уникальные значение для указанной колонки или составного ключа.
Статьи, которые советую почитать чтобы глубже разобраться в теме
- Очень хорошая статья о всех типах индексов, когда их стоит создавать и как использовать
- Индексы. Теоретические основы.