Индексы в 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);
Особенности
- Данные хранятся в произвольном порядке, а индекс содержит ссылки на соответствующие строки.
- Позволяет ускорить поиск по часто запрашиваемым столбцам без изменения физического порядка данных.
- Может замедлять операции вставки, обновления и удаления из-за необходимости пересчета индексов.
Сравнение кластеризованных и некластеризованных индексов
Характеристика | Кластеризованный индекс | Некластеризованный индекс |
---|---|---|
Количество в таблице | Только один | Несколько |
Физический порядок данных | Упорядочен по индексу | Произвольный |
Производительность поиска | Быстрее для диапазонных запросов | Быстрее для точечных запросов |
Влияние на вставку/удаление | Может замедлять операции | Меньше влияет на операции |