Ответ
Да, можно и часто нужно. Индекс создается для ускорения поиска и сортировки, а не только для обеспечения уникальности.
Зачем индексировать не уникальное поле?
- Ускорение
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) может быть менее полезным.