Что такое некластерный индекс в базах данных?

Ответ

Некластерный индекс — это отдельная от данных структура, которая хранит отсортированные значения ключевых столбцов вместе с указателем на местоположение соответствующей строки в таблице. Он не изменяет физический порядок данных.

Ключевые особенности:

  • Множество индексов: На одной таблице можно создать множество некластерных индексов.
  • Структура B-дерева: Листовые узлы содержат ключ индекса и указатель (например, значение кластерного ключа или идентификатор строки (RID) в куче).
  • Дополнительный шаг: Для получения данных, не входящих в индекс, требуется дополнительное обращение к основной таблице (кластерному индексу или куче).

Пример создания:

-- Создание некластерного индекса по столбцу last_name
CREATE INDEX idx_lastname ON employees(last_name);

Как работает запрос:

SELECT * FROM employees WHERE last_name = 'Ivanov';
  1. СУБД находит запись 'Ivanov' в индексе idx_lastname.
  2. Из листового узла индекса извлекается указатель (например, id сотрудника).
  3. По этому указателю выполняется поиск в кластерном индексе (или куче) для получения всех данных строки 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';
  1. База данных, такая хитрая жопа, лезет не в саму таблицу employees, а в наш индекс idx_lastname. Там она моментально находит всех 'Ivanov', потому что они отсортированы.
  2. Из листика индекса она выдёргивает указатель — допустим, id этого самого Иванова.
  3. А дальше — ключевой момент, ёпта! — по этому id она идёт уже в кластерный индекс (или в кучу, если его нет) и вытаскивает оттуда уже всю строку со всеми данными: имя, зарплату, дату найма — всё, что тебе надо.

Итог, как всегда, палка о двух концах:

  • Хорошо: Запросы SELECT, WHERE, сортировки (ORDER BY) и соединения (JOIN) начинают летать, как угорелые. Скорость поиска — просто ебать мои старые костыли.
  • Плохо: Место на диске жрёт, как не в себя. А главное — каждый раз, когда ты добавляешь, обновляешь или удаляешь запись, эту самую записную книжку-индекс тоже надо поправлять. Так что операции INSERT, UPDATE, DELETE начинают тормозить, будто им хуй в винт засунули. Волнение ебать, но терпения ноль.