Есть ли опыт работы с композитными индексами?

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

Ответ

Да, опыт есть. Композитный (составной) индекс — это индекс, созданный по нескольким столбцам таблицы. Он оптимизирует запросы, которые используют эти столбцы в условиях WHERE, ORDER BY или JOIN.

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

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

-- Индекс для запросов по LastName или по LastName + FirstName
CREATE INDEX IX_Customers_LastName_FirstName 
ON Customers (LastName ASC, FirstName ASC)
INCLUDE (Email); -- Опционально: включение дополнительных данных

Когда индекс будет использован (примеры запросов):

-- ДА: Использует индекс (фильтр по первому столбцу)
SELECT * FROM Customers WHERE LastName = 'Smith';

-- ДА: Использует индекс (фильтр по обоим столбцам)
SELECT * FROM Customers WHERE LastName = 'Smith' AND FirstName = 'John';

-- НЕТ (в большинстве СУБД): Фильтр только по второму столбцу
SELECT * FROM Customers WHERE FirstName = 'John';

Создание в Entity Framework Core (Code First):

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Customer>()
        .HasIndex(c => new { c.LastName, c.FirstName })
        .HasDatabaseName("IX_Customers_NameComposite")
        .IsClustered(false); // Некластеризованный
}

Практические соображения:

  • Анализ запросов: Перед созданием проанализируйте частые WHERE и ORDER BY в рабочих нагрузках.
  • Селективность: Первым обычно ставят столбец с высокой селективностью (больше уникальных значений).
  • INCLUDE: В SQL Server используйте INCLUDE для добавления в листовые узлы индекса часто запрашиваемых, но не фильтруемых столбцов, чтобы избежать обращений к основной таблице (покрывающий индекс).
  • Цена: Индексы ускоряют чтение, но замедляют вставку/обновление/удаление. Нужен баланс.