Поскольку @danihp ответил на первую часть вопроса, я попытаюсь ответить на вторую «где она используется конкретно» .Это для Oracle, но это верно для большинства СУБД.
Предположим, у нас есть таблица my_table
, которая уникально индексируется в столбце id
и имеет второй индекс, который не является уникальным,в столбце yet_another_column
:
create my_table ( id varchar2(20) not null
, another_column not null
, yet_another_column
, constraint pk_my_table primary key (id)
);
create index i_my_table on my_table ( yet_another_column );
Теперь, если бы мы были select * from my_table where id = '1'
, это сделало бы / должно выполнить сканирование уникального индекса индекса pk_my_table
.Затем мы повторно вводим таблицу, используя индекс, чтобы вернуть все в my_table
, где id = '1'
.
Если бы вместо этого был запрос select id from my_table where id = 'a'
, то нет необходимости во втором этапе, так каквсе значения, которые нам нужны, содержатся в индексе.В этом случае запрос будет выполнять только сканирование уникального индекса 1021 *.
Далее, если наш запрос будет select * from my_table where yet_another_column = 'y'
, то у нас будет индекс по столбцу, но он не уникален поэтому нам нужно просмотреть весь индекс, чтобы попытаться найти все значения, которые соответствуют нашему условию where, то есть просмотр индекса .Еще раз мы выбираем столбцы, которых нет в нашем индексе, поэтому нам нужно повторно войти в таблицу, чтобы получить их.
Наконец, если бы наш запрос был select id from my_table where another_column = 'yes'
.У нас нет индекса для another_column
, поэтому мы должны выполнить сканирование таблицы , чтобы найти значение, то есть мы должны найти все в таблице where another_column = 'yes'
.
Теперь, возможно,Похоже, что в этих случаях нет особой разницы между просмотром таблицы и сканированием индекса.Нам все еще нужно найти значение в объекте в базе данных.Однако, так как индекс намного меньше и специально предназначен для сканирования (см. Другие ответы), обычно намного быстрее выполнить сканирование индекса , если вы хотите только небольшую часть строк втаблица .Если вы хотите сказать 10% таблицы, тогда этот пункт становится "это зависит".