Кластеризованные и некластеризованные индексы в SQL

Индексы в SQL помогают ускорять поиск данных, но существуют разные их типы. Основными являются кластеризованные (clustered) и некластеризованные (non-clustered) индексы. Они различаются способом хранения данных и влиянием на производительность запросов.

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

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

Пример создания кластеризованного индекса

CREATE CLUSTERED INDEX idx_orders_date ON orders(order_date);

Особенности

  • Таблица с кластеризованным индексом называется кластеризованной.
  • Физический порядок строк соответствует значению индекса.
  • Быстрее выполняются запросы, использующие диапазонный поиск (BETWEEN, ORDER BY).
  • Вставка и обновление могут быть медленнее, так как изменяется порядок хранения данных.

Некластеризованный индекс

Некластеризованный индекс создается отдельно от данных и содержит указатели (row locator) на строки таблицы. В одной таблице можно создать несколько некластеризованных индексов.

Пример создания некластеризованного индекса

CREATE INDEX idx_users_email ON users(email);

Особенности

  • Данные хранятся в произвольном порядке, а индекс содержит ссылки на соответствующие строки.
  • Позволяет ускорить поиск по часто запрашиваемым столбцам без изменения физического порядка данных.
  • Может замедлять операции вставки, обновления и удаления из-за необходимости пересчета индексов.

Сравнение кластеризованных и некластеризованных индексов

ХарактеристикаКластеризованный индексНекластеризованный индекс
Количество в таблицеТолько одинНесколько
Физический порядок данныхУпорядочен по индексуПроизвольный
Производительность поискаБыстрее для диапазонных запросовБыстрее для точечных запросов
Влияние на вставку/удалениеМожет замедлять операцииМеньше влияет на операции