В каком случае уместно наличие индекса по полю наименования в таблице компаний
Что проверяют
Умеете ли вы решать про индекс исходя из запросов, а не из названия колонки. Следом обычно спрашивают, поможет ли такой индекс поиску по подстроке и как вы проверите, что он вообще используется.
Как отвечать
Индекс по Name уместен, когда под него есть конкретные запросы:
- точный поиск и поиск по началу:
WHERE Name = @nameиLIKE 'Рома%', например для автодополнения. B-tree обслуживает оба случая, но в PostgreSQL для префикса при collation, отличной отC, нужен индекс сtext_pattern_ops; - сортировка с постраничным выводом:
ORDER BY NameсTOPилиLIMITчитает индекс по порядку и не сортирует всю таблицу; - уникальность: если бизнес требует уникальных названий, уникальный индекс гарантирует это на уровне базы, и проверка в коде перестаёт быть единственной защитой;
- размер таблицы: на сотне строк индекс не нужен, на сотнях тысяч разница заметна.
Когда он не поможет: LIKE '%рома%' обычным B-tree не ускоряется. Для поиска по подстроке в PostgreSQL есть pg_trgm с GIN-индексом, в SQL Server полнотекстовый индекс. И помните, что названия компаний по природе не уникальны, одинаковых «Ромашек» в реестре полно, а настоящий уникальный ключ это ИНН.
В EF Core индекс объявляется так: modelBuilder.Entity<Company>().HasIndex(c => c.Name).IsUnique() или атрибутом [Index(nameof(Name))] на классе, частичный через HasFilter. SQL, который получается из LINQ, смотрите через ToQueryString(), а использование индекса проверяйте планом выполнения: EXPLAIN ANALYZE в PostgreSQL, фактический план в SQL Server.
Где спотыкаются
Пишут в LINQ c.Name.ToLower() == name.ToLower(). Функция над колонкой не даёт использовать индекс. В SQL Server регистр обычно и так не важен из-за collation, в PostgreSQL нужен индекс по lower(name) или тип citext.
Ждут, что Contains в LINQ использует индекс. EF Core переводит его в поиск по подстроке, и индекс по Name здесь бесполезен.
Забывают про тип колонки: nvarchar(max) в SQL Server нельзя сделать ключом индекса, названию нужна разумная ограниченная длина.