Ответ
Да, опыт есть. Композитный (составной) индекс — это индекс, созданный по нескольким столбцам таблицы. Он оптимизирует запросы, которые используют эти столбцы в условиях 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для добавления в листовые узлы индекса часто запрашиваемых, но не фильтруемых столбцов, чтобы избежать обращений к основной таблице (покрывающий индекс).- Цена: Индексы ускоряют чтение, но замедляют вставку/обновление/удаление. Нужен баланс.
Ответ 18+ 🔞
А, композитные индексы, говоришь? Ну, опыт, конечно, есть, блядь. Это ж классика, как водка под селёдку.
Смотри, суть проще пареной репы, но народ постоянно на грабли наступает. Берёшь несколько столбцов, склеиваешь их в один индекс, и база начинает летать на запросах, которые по этим столбцам фильтруют или сортируют. Но тут, мать его, главный подводный камень — порядок столбцов. Это не просто список, это священная иерархия, блядь!
Представь себе телефонную книгу. Она отсортирована сначала по фамилии, потом по имени. Найти всех Ивановых — легко. Найти Иванова Петра — вообще огонь. А попробуй найти всех Петров по всему городу, только по имени — и ты охуеешь, потому что придётся листать всю книгу с начала до конца. Вот и индекс так же работает, только по префиксу.
Создаётся это дело просто, как два пальца:
CREATE INDEX IX_Customers_LastName_FirstName
ON Customers (LastName, FirstName)
INCLUDE (Email); -- Это чтобы лишний раз по основной таблице не лазить
А теперь, где сработает, а где — нихуя:
-- О, красота! Берет первый столбец индекса — использует.
SELECT * FROM Customers WHERE LastName = 'Smith';
-- Идеально! Берёт оба столбца по порядку — использует на полную.
SELECT * FROM Customers WHERE LastName = 'Smith' AND FirstName = 'John';
-- А вот это, прости, полный пиздец. Фильтр только по FirstName.
-- Для индекса это всё равно что искать Петров в той книге. Не использует, либо использует нихуя не эффективно.
SELECT * FROM Customers WHERE FirstName = 'John';
В Entity Framework Core тоже не заморачивайся особо:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>()
.HasIndex(c => new { c.LastName, c.FirstName }) // Вот он, порядок! Сначала LastName, потом FirstName.
.HasDatabaseName("IX_Customers_NameComposite");
}
**
Итоговая мысль, чтобы в башке отложилось:**
Не создавай индексы, как бог на душу положит. Сначала смотри, какие запросы у тебя реально тормозят, какие `WHERE` и `ORDER BY` народ использует. Первым в индекс суй столбцы с высокой уникальностью — это селективность, ёпта. И помни золотое правило: **индекс работает на запросы, которые фильтруют по префиксу его столбцов.** Всё остальное — это уже танцы с бубном и полный разгон планировщика.
А то наклепаешь индексов на каждую колонку, а потом удивляешься, почему INSERT'ы стали ебашить как черепаха. За всё надо платить, чувак. Скорость чтения — за счёт скорости записи. Баланс ищи, везде баланс.