Что хранит в себе некластерный индекс?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что хранит в себе некластерный индекс?
Некластерный индекс — это специальная структура данных в базе данных, которая содержит отсортированные значения одного или нескольких столбцов и указатели на строки таблицы. В отличие от кластерного индекса, который определяет физический порядок хранения данных, некластерный индекс создаёт логическую структуру для быстрого поиска.
Структура некластерного индекса
Некластерный индекс хранит:
- Ключевые столбцы — значения столбцов, по которым построен индекс (например, email, username)
- Row Locator — указатель на строку в таблице:
- Если таблица имеет кластерный индекс — это значение кластерного ключа (более эффективно)
- Если таблица — heap (без кластерного индекса) — это физический указатель на строку (RID: Row Identifier)
- Включённые столбцы (опционально) — дополнительные столбцы, добавленные через INCLUDE, чтобы избежать обращения к основной таблице
Пример структуры
// Таблица Users
// +--------+----------+-------+--------+
// | UserID | Email | Name | Phone |
// +--------+----------+-------+--------+
// | 1 | a@ex.com | Alice | 12345 |
// | 2 | b@ex.com | Bob | 67890 |
// | 3 | c@ex.com | Carol | 11111 |
// +--------+----------+-------+--------+
// Некластерный индекс на Email:
// +----------+--------+
// | Email | RID |
// +----------+--------+
// | a@ex.com | (1:96) |
// | b@ex.com | (1:104)|
// | c@ex.com | (1:112)|
// +----------+--------+
Как работает поиск
Когда выполняется запрос:
SELECT * FROM Users WHERE Email = 'john@example.com';
База данных:
- Использует некластерный индекс на Email для бинарного поиска значения 'john@example.com'
- Находит Row Locator (указатель на строку)
- По этому указателю переходит в основную таблицу и извлекает остальные данные
- Возвращает результат
Этот процесс называется Key Lookup или Bookmark Lookup.
Отличие от кластерного индекса
| Характеристика | Кластерный | Некластерный |
|---|---|---|
| Структура хранения | Определяет физический порядок | Создаёт логическую структуру |
| Количество на таблицу | Максимум 1 | До 999 |
| Row Locator | Кластерный ключ или RID | Кластерный ключ или RID |
| Скорость поиска | Быстрее (прямой доступ) | Медленнее (требует lookup) |
Оптимизация: включённые столбцы
Для улучшения производительности можно добавить часто запрашиваемые столбцы:
// Индекс с включённым столбцом Name
CREATE NONCLUSTERED INDEX IX_Users_Email
ON Users(Email)
INCLUDE (Name);
// Теперь для запроса:
SELECT Email, Name FROM Users WHERE Email = 'john@example.com';
// База может прочитать данные только из индекса (Index Coverage)
// и избежать обращения к основной таблице
Key Takeaway
Некластерный индекс хранит отсортированные ключевые значения и указатели на строки таблицы, обеспечивая быстрый поиск без влияния на физический порядок хранения данных. Это мощный инструмент для оптимизации запросов, особенно когда нужны индексы по нескольким столбцам.