Ответ
Некластерный индекс — это отдельная от данных структура, которая хранит отсортированные значения ключевых столбцов вместе с указателем на местоположение соответствующей строки в таблице. Он не изменяет физический порядок данных.
Ключевые особенности:
- Множество индексов: На одной таблице можно создать множество некластерных индексов.
- Структура B-дерева: Листовые узлы содержат ключ индекса и указатель (например, значение кластерного ключа или идентификатор строки (RID) в куче).
- Дополнительный шаг: Для получения данных, не входящих в индекс, требуется дополнительное обращение к основной таблице (кластерному индексу или куче).
Пример создания:
-- Создание некластерного индекса по столбцу last_name
CREATE INDEX idx_lastname ON employees(last_name);
Как работает запрос:
SELECT * FROM employees WHERE last_name = 'Ivanov';
- СУБД находит запись
'Ivanov'в индексеidx_lastname. - Из листового узла индекса извлекается указатель (например,
idсотрудника). - По этому указателю выполняется поиск в кластерном индексе (или куче) для получения всех данных строки
employees.
Компромиссы:
- Плюсы: Ускоряет операции
SELECT,WHERE,ORDER BY,JOIN. - Минусы: Занимает дополнительное дисковое пространство; замедляет
INSERT,UPDATE,DELETE, так как требует обновления самих индексов.
Ответ 18+ 🔞
А, ну вот, смотри, классика жанра! Некластерный индекс — это как отдельная, блядь, записная книжка, куда ты выписал всех тёток по имени, но чтобы с ними встретиться, тебе ещё надо, сука, по этому имени найти её телефон в основном справочнике. Данные-то на месте сидят, как сидели, в пизду, а эта книжечка — просто отсортированный список для быстрого поиска.
Что важно запомнить, чтобы не облажаться:
- Можно навешать дохуя: На одну таблицу этих индексов можно наклепать, как обезьяна гранат, — хоть десять, хоть двадцать. Главное, чтобы место на диске не кончилось, а то будет овердохуища индексов и нихуя скорости.
- Внутри — дерево, а в листочках — адресок: В листовых узлах этого B-дерева лежит не вся строка, а только ключ поиска и, прости господи, указатель — либо на кластерный ключ, либо прямо на строку в куче (этот RID, падла).
- Лишние телодвижения: Если тебе нужно взять данные, которых в индексе нет — всё, пиши пропало, придётся делать дополнительный заход в основную таблицу. Это как найти в меню блюдо, а потом идти на кухню за ним — шаг лишний, блядь.
Вот, смотри, как это создаётся, проще пареной репы:
-- Делаем индекс по фамилии, чтобы быстро искать всех Ивановых
CREATE INDEX idx_lastname ON employees(last_name);
А вот как этот цирк работает, когда ты ищешь кого-то:
SELECT * FROM employees WHERE last_name = 'Ivanov';
- База данных, такая хитрая жопа, лезет не в саму таблицу
employees, а в наш индексidx_lastname. Там она моментально находит всех 'Ivanov', потому что они отсортированы. - Из листика индекса она выдёргивает указатель — допустим,
idэтого самого Иванова. - А дальше — ключевой момент, ёпта! — по этому
idона идёт уже в кластерный индекс (или в кучу, если его нет) и вытаскивает оттуда уже всю строку со всеми данными: имя, зарплату, дату найма — всё, что тебе надо.
Итог, как всегда, палка о двух концах:
- Хорошо: Запросы
SELECT,WHERE, сортировки (ORDER BY) и соединения (JOIN) начинают летать, как угорелые. Скорость поиска — просто ебать мои старые костыли. - Плохо: Место на диске жрёт, как не в себя. А главное — каждый раз, когда ты добавляешь, обновляешь или удаляешь запись, эту самую записную книжку-индекс тоже надо поправлять. Так что операции
INSERT,UPDATE,DELETEначинают тормозить, будто им хуй в винт засунули. Волнение ебать, но терпения ноль.