Каковы основные принципы создания индексов в базах данных?

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

Ответ

Создание эффективных индексов базируется на нескольких ключевых принципах, направленных на баланс между скоростью чтения и затратами на запись/хранение.

Основные принципы:

  1. Индексируйте селективные столбцы: Добавляйте индексы на столбцы, часто используемые в условиях WHERE, JOIN, ORDER BY и GROUP BY.
  2. Учитывайте компромиссы: Индексы ускоряют выборку (SELECT), но замедляют операции вставки, обновления и удаления (INSERT, UPDATE, DELETE), а также занимают дополнительное место на диске.
  3. Используйте составные индексы правильно: Порядок столбцов в составном индексе критически важен. Индекс (last_name, first_name) может быть использован для поиска по last_name, но не по одному только first_name (правило левого префикса).
  4. Избегайте избыточности: Не создавайте индексы, которые дублируют функциональность других индексов (например, индекс (A, B) часто делает излишним индекс только на (A)).

Пример создания индексов:

-- Простой индекс на столбец email
CREATE INDEX idx_users_email ON users(email);

-- Составной индекс для запросов с фильтрацией и сортировкой
CREATE INDEX idx_employees_dept_salary ON employees(department_id, salary DESC);

Пример аннотации в JPA (Hibernate):

@Entity
@Table(name = "users", indexes = {
    @Index(name = "idx_user_email_status", columnList = "email, status")
})
public class User {
    @Id
    private Long id;
    private String email;
    private String status;
}