Что такое кластерный индекс в базах данных?

«Что такое кластерный индекс в базах данных?» — вопрос из категории Базы данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевые особенности:

  • Физическое упорядочивание: Строки в таблице хранятся на диске в порядке, заданном ключом кластерного индекса.
  • Первичный ключ: В SQL Server и некоторых других СУБД создание первичного ключа (PRIMARY KEY) по умолчанию приводит к созданию кластерного индекса, если он еще не существует.
  • Скорость запросов: Запросы, использующие диапазон значений по ключу кластерного индекса (WHERE id BETWEEN 10 AND 100), выполняются очень быстро, так как данные физически расположены рядом.

Пример создания в SQL Server:

-- Создание таблицы с кластерным индексом по полю OrderID
CREATE TABLE Orders (
    OrderID INT NOT NULL PRIMARY KEY CLUSTERED, -- PRIMARY KEY создает кластерный индекс
    CustomerID INT,
    OrderDate DATETIME
);
-- ИЛИ явное создание после создания таблицы
CREATE CLUSTERED INDEX IX_Orders_OrderDate ON Orders(OrderDate);
Сравнение с некластерным индексом: Аспект Кластерный индекс Некластерный индекс
Количество Один на таблицу Много на таблицу
Содержимое Содержит сами данные таблицы Содержит ключ + указатель на строку данных
Скорость выборки Максимальная для диапазонных запросов Быстрее, чем полное сканирование, но медленнее кластерного
Влияние на INSERT/UPDATE Может быть медленнее, так как требует переупорядочивания данных Обычно быстрее, так как обновляется только структура индекса

Практические рекомендации:

  • Выбирайте для кластеризации столбец, который часто используется в запросах диапазонов (BETWEEN, >, <) или ORDER BY.
  • Хорошие кандидаты: монотонно возрастающие ключи (например, IDENTITY), часто используемые в соединениях.
  • Избегайте кластеризации по часто изменяемым столбцам или столбцам с большим размером, так как это приведет к постоянной физической реорганизации данных (фрагментации).