Ответ
Покрывающий индекс (covering index) — это индекс, который содержит все поля, необходимые для выполнения запроса. Это позволяет получить данные непосредственно из индекса без обращения к таблице (index-only scan), что значительно ускоряет выполнение запросов.
Пример в SQL
-- Таблица пользователей
CREATE TABLE users (
id BIGINT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100),
created_at TIMESTAMP,
status VARCHAR(20)
);
-- Создаём покрывающий индекс для часто выполняемого запроса
CREATE INDEX idx_users_covering
ON users(status, created_at, username, email);
-- Запрос использует только индекс (Index Only Scan)
SELECT username, email, created_at
FROM users
WHERE status = 'ACTIVE'
ORDER BY created_at DESC;
-- Все необходимые поля (username, email, created_at, status)
-- присутствуют в индексе
В JPA/Hibernate
@Entity
@Table(name = "users", indexes = {
@Index(name = "idx_covering_active_users",
columnList = "status, created_at, username, email")
})
public class User {
@Id
private Long id;
private String username;
private String email;
private LocalDateTime createdAt;
private String status;
// Геттеры и сеттеры
}
Преимущества покрывающих индексов
- Уменьшение I/O операций: Данные читаются из индекса, который обычно меньше таблицы.
- Исключение операций доступа к таблице: Нет необходимости в random reads.
- Улучшение производительности: Особенно для read-heavy workload.
Ограничения и рекомендации
- Размер индекса: Покрывающие индексы могут быть большими, так как включают много столбцов.
- Обновление данных: Затраты на поддержку индекса при INSERT/UPDATE/DELETE.
- Использовать для:
- Часто выполняемых запросов
- Запросов, возвращающих небольшой подмножество столбцов
- OLAP-систем и отчётов
Проверка использования: В PostgreSQL — EXPLAIN (ANALYZE, BUFFERS), смотрите на Index Only Scan в плане выполнения.