Что такое покрывающий индекс и как его использовать?

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

Ответ

Покрывающий индекс (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;

    // Геттеры и сеттеры
}

Преимущества покрывающих индексов

  1. Уменьшение I/O операций: Данные читаются из индекса, который обычно меньше таблицы.
  2. Исключение операций доступа к таблице: Нет необходимости в random reads.
  3. Улучшение производительности: Особенно для read-heavy workload.

Ограничения и рекомендации

  • Размер индекса: Покрывающие индексы могут быть большими, так как включают много столбцов.
  • Обновление данных: Затраты на поддержку индекса при INSERT/UPDATE/DELETE.
  • Использовать для:
    • Часто выполняемых запросов
    • Запросов, возвращающих небольшой подмножество столбцов
    • OLAP-систем и отчётов

Проверка использования: В PostgreSQL — EXPLAIN (ANALYZE, BUFFERS), смотрите на Index Only Scan в плане выполнения.