У вас есть 2 индекса: первичный ключ (кластеризованный индекс) на emp_no
и вторичный (некластеризованный) индекс на first_name_last_name
.
Вот так выглядят эти индексы:
![enter image description here](https://i.stack.imgur.com/cas0W.png)
Теперь при выполнении следующего запроса:
SELECT first_name, last_name FROM employees.employees WHERE emp_no < '10010';
Оптимизатору SQL необходимо найти все записи с помощью emp_ne < 10010
. Ваш индекс first_name_last_name
не помогает найти записи с emp_no
меньше, чем 10010, поскольку он не содержит эту информацию.
Таким образом, оптимизатор SQL будет выполнять поиск в вашем кластерном индексе, чтобы найти всех сотрудников с требуемым числом сотрудниковнет никаких причин получать имя и фамилию из вторичного индекса, поскольку оптимизатор SQL уже нашел эту информацию.
Теперь, если вы измените запрос на:
SELECT * FROM employees.employees WHERE first_name = 'john';
Тогдаоптимизатор SQL будет использовать ваш вторичный (некластеризованный) индекс для поиска записей, поскольку это самый простой способ сузить результат поиска.
Примечание:
Если вы выполните следующий запрос:
SELECT * FROM employees.employees WHERE last_name = 'smith';
Ваш вторичный индекс не будет использоваться, поскольку ваш вторичный индекс представляет собой составной индекс, содержащий first_name
и last_name
..., так как индекс сортируется поfirst_name
, тогда по last_name
это не будет полезно для поискового запроса на last_name
. В этом случае оптимизатор SQL будет сканировать всю таблицу, чтобы найти записи с last_name = 'smith'
Обновление
Думайте об этом как об индексе в конце книги. Представьте, что у вас есть путеводитель по Бразилии ... в нем есть список всех ресторанов и еще один индекс всех отелей в Бразилии.
Указатель ресторанов
- Ресторан 1: упоминается на странице 12 и 77 путеводителя по Бразилии
- Ресторан 2: упоминается на странице 33 путеводителя по Бразилии
- ...
Индекс отеля
- Отель 1: упоминается на странице 5 путеводителя по Бразилии
- Отель 2: упоминается на страницах 33 и 39 путеводителя по Бразилии
- ...
Теперь, если вы хотите найти книгуи найдите все страницы, которые упоминают город Рио-де-Жанейро , ни один из этих индексов не является полезным. Если в книге нет третьего указателя названий городов, вам придется отсканировать всю книгу, чтобы найти эти страницы.