Можно ли создать индекс по не уникальному полю в базе данных?

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

Ответ

Да, можно и часто нужно. Индекс создается для ускорения поиска и сортировки, а не только для обеспечения уникальности.

Зачем индексировать не уникальное поле?

  • Ускорение WHERE и JOIN: Если часто ищут сотрудников по department_id, индекс на этом столбце резко ускорит такие запросы, даже если в отделе много людей.
  • Ускорение ORDER BY и GROUP BY.
  • Реализация внешних ключей (FOREIGN KEY) — для них часто автоматически создаются индексы.

Пример создания (SQL и JPA/Hibernate):

-- SQL
CREATE INDEX idx_employee_department ON employees (department_id);
// JPA / Hibernate
@Entity
@Table(name = "employees",
       indexes = @Index(name = "idx_emp_dept", columnList = "department_id"))
public class Employee {
    @Column(name = "department_id")
    private Long departmentId; // Много сотрудников в одном отделе
}

Особенности и компромиссы:

  • Плюс: Быстрый поиск по часто используемым не уникальным условиям.
  • Минус: Индекс занимает место на диске и замедляет операции INSERT, UPDATE, DELETE, так как индексную структуру тоже нужно обновлять.
  • Кардинальность: Эффективность индекса выше для полей с высокой кардинальностью (много уникальных значений). Индекс на поле с малым числом вариантов (например, gender) может быть менее полезным.