← Назад к вопросам

В чем разница между кластерным и некластерным индексами?

2.0 Middle🔥 171 комментариев
#SQL и базы данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между кластерным и некластерным индексами

Кластерный индекс

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

Основные характеристики:

  • Уникальность: в таблице только один кластерный индекс
  • Листовые узлы: содержат сами данные таблицы (весь ряд целиком)
  • Производительность: быстро находит диапазоны значений
  • Хранение: определяет структуру 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), кластерный индекс даст огромный выигрыш
  • Первичный ключ: обычно первичный ключ выступает кластерным индексом

Понимание различий между кластерным и некластерным индексами критично для оптимизации запросов и структурирования баз данных.