Ответ
Создание эффективных индексов базируется на нескольких ключевых принципах, направленных на баланс между скоростью чтения и затратами на запись/хранение.
Основные принципы:
- Индексируйте селективные столбцы: Добавляйте индексы на столбцы, часто используемые в условиях
WHERE,JOIN,ORDER BYиGROUP BY. - Учитывайте компромиссы: Индексы ускоряют выборку (
SELECT), но замедляют операции вставки, обновления и удаления (INSERT,UPDATE,DELETE), а также занимают дополнительное место на диске. - Используйте составные индексы правильно: Порядок столбцов в составном индексе критически важен. Индекс
(last_name, first_name)может быть использован для поиска поlast_name, но не по одному толькоfirst_name(правило левого префикса). - Избегайте избыточности: Не создавайте индексы, которые дублируют функциональность других индексов (например, индекс
(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;
}