В чем отличие между кластерными и некластерными индексами?
Кластерный индекс определяет физический порядок хранения данных в таблице, а некластерный — создаёт отдельную структуру со ссылками на строки, не влияя на физическое расположение данных.
Сравнение
| Характеристика | Кластерный индекс | Некластерный индекс |
|---|---|---|
| Физический порядок данных | Данные упорядочены по ключу индекса | Произвольный |
| Количество на таблицу | Один | Много |
| Скорость последовательного чтения | Высокая (данные рядом на диске) | Зависит от фактора кластеризации |
| Скорость вставки | Медленная (нужно поддерживать порядок) | Быстрее |
| Дополнительное место | Минимальное (данные = индекс) | Требует отдельную структуру |
| Листовые узлы содержат | Сами данные строки | Указатели на строки |
Как это работает
Кластерный индекс — это как телефонный справочник, где записи физически упорядочены по фамилии. Чтобы найти всех людей на букву «К», достаточно открыть нужную страницу и читать подряд.
Некластерный индекс — это как предметный указатель в книге. Указатель упорядочен, но сами страницы не переставлены. Для каждого слова нужно перейти на указанную страницу.
Фактор кластеризации
Фактор кластеризации показывает, насколько физический порядок строк в таблице соответствует порядку ключей некластерного индекса. При высоком факторе (строки расположены хаотично относительно индекса) каждый поиск по индексу требует обращения к отдельной странице диска, и эффективность индекса падает.
Особенности в разных СУБД
| СУБД | Кластерный индекс |
|---|---|
| MySQL (InnoDB) | Таблица всегда кластеризована по PK (если нет PK, генерируется скрытый) |
| PostgreSQL | Команда CLUSTER, но не поддерживается автоматически при INSERT |
| SQL Server | CLUSTERED INDEX, один на таблицу |
На собеседовании: интервьюер хочет услышать ключевую разницу: кластерный = физический порядок данных, некластерный = отдельная структура со ссылками. Частая ошибка — не знать, что в InnoDB (MySQL) таблица всегда кластеризована по первичному ключу.