В чем разница между кластерным и некластерным индексами?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между кластерным и некластерным индексами
Кластерный индекс
Кластерный индекс — это индекс, который определяет физический порядок расположения строк таблицы на диске. В каждой таблице может быть только ОДИН кластерный индекс, так как строки не могут быть упорядочены одновременно по нескольким ключам.
Основные характеристики:
- Уникальность: в таблице только один кластерный индекс
- Листовые узлы: содержат сами данные таблицы (весь ряд целиком)
- Производительность: быстро находит диапазоны значений
- Хранение: определяет структуру B-дерева для данных таблицы
Пример создания:
CREATE CLUSTERED INDEX idx_users_id
ON users (user_id ASC);
Некластерный индекс
Некластерный индекс — это отдельная структура, которая содержит ключевые колонки и указатели (закладки) на строки данных. В таблице может быть ДО 999 некластерных индексов (в SQL Server), индекс не влияет на физический порядок строк.
Основные характеристики:
- Множественность: можно создать много некластерных индексов
- Листовые узлы: содержат индексируемые колонки и закладку на данные
- Гибкость: используются для поиска по различным колонкам
- Дополнительное хранилище: требуют отдельное место на диске
Пример создания:
CREATE NONCLUSTERED INDEX idx_users_email
ON users (email ASC)
INCLUDE (first_name, last_name);
Ключевые отличия
| Свойство | Кластерный | Некластерный |
|---|---|---|
| Количество на таблицу | 1 | До 999 |
| Листья содержат | Всю строку таблицы | Ключи + закладка на строку |
| Физический порядок | Определяет | Не влияет |
| Поиск по ключу | Один ход к данным | Два хода (индекс → данные) |
| INSERT/UPDATE/DELETE | Медленнее (пересортировка) | Быстрее |
| Размер | Минимален | Может быть больше |
Практический пример
Таблица сотрудников:
-- Кластерный индекс по employee_id
CREATE CLUSTERED INDEX PK_employees
ON employees (employee_id);
-- Некластерные индексы для поиска
CREATE NONCLUSTERED INDEX idx_emp_email
ON employees (email);
CREATE NONCLUSTERED INDEX idx_emp_department
ON employees (department_id)
INCLUDE (salary, hire_date);
При запросе SELECT * FROM employees WHERE employee_id = 5 SQL Server сразу перейдёт к строке (кластерный индекс). А при SELECT * FROM employees WHERE email = test@example.com будет использован некластерный индекс, который направит к нужной строке.
Выбор кластерного индекса
Для выбора кластерного индекса следует учитывать:
- Уникальность: значения должны быть уникальны или часто используются в WHERE
- Статичность: менять кластерный индекс дорого
- Диапазонные запросы: если часто ищите диапазоны (WHERE id BETWEEN), кластерный индекс даст огромный выигрыш
- Первичный ключ: обычно первичный ключ выступает кластерным индексом
Понимание различий между кластерным и некластерным индексами критично для оптимизации запросов и структурирования баз данных.