Ответ
Да, опыт есть. Композитный (составной) индекс — это индекс, созданный по нескольким столбцам таблицы. Он оптимизирует запросы, которые используют эти столбцы в условиях 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для добавления в листовые узлы индекса часто запрашиваемых, но не фильтруемых столбцов, чтобы избежать обращений к основной таблице (покрывающий индекс).- Цена: Индексы ускоряют чтение, но замедляют вставку/обновление/удаление. Нужен баланс.