← Назад к вопросам

Что такое составные индексы?

2.0 Middle🔥 181 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое составные индексы?

Составной индекс (также известный как композитный, составной или многоколонный индекс) — это индекс базы данных, который создаётся не на одну, а на несколько колонок таблицы. Он позволяет оптимизировать запросы, которые используют в условиях фильтрации, сортировки или соединения эти колонки в определённой последовательности. В отличие от простого индекса на одну колонку, составной индекс учитывает комбинацию значений, что делает его мощным инструментом для ускорения сложных запросов, но требует внимательного проектирования.

Как работает составной индекс?

Представьте, что у нас есть таблица users с колонками last_name, first_name и email. Если мы создадим составной индекс на колонки (last_name, first_name), то индекс будет хранить данные, отсортированные сначала по last_name, а затем по first_name для одинаковых фамилий. Это позволяет эффективно выполнять запросы, которые используют:

  • Обе колонки вместе.
  • Только колонку last_name.
  • Но не эффективно для запросов только по first_name, так как первая колонка индекса отсутствует в условии.

Пример на SQL:

-- Создание составного индекса
CREATE INDEX idx_name ON users (last_name, first_name);

-- Эффективные запросы для этого индекса:
SELECT * FROM users WHERE last_name = 'Иванов';
SELECT * FROM users WHERE last_name = 'Иванов' AND first_name = 'Алексей';
SELECT * FROM users ORDER BY last_name, first_name;

-- Неэффективные запросы (индекс может не использоваться или использоваться частично):
SELECT * FROM users WHERE first_name = 'Алексей'; -- first_name не первая в индексе

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

  1. Ускорение сложных запросов: Они оптимизируют запросы с несколькими условиями WHERE, JOIN или ORDER BY, особенно когда эти операции затрагивают индексные колонки.
  2. Покрывающие индексы (Covering Indexes): Если индекс содержит все колонки, необходимые для запроса, база данных может выполнить запрос, используя только индекс, без обращения к таблице (избегая дорогостоящих операций чтения данных).
    -- Например, для индекса (last_name, first_name, email):
    SELECT last_name, first_name FROM users WHERE last_name = 'Иванов';
    -- Данные берутся напрямую из индекса.
    
  3. Оптимизация сортировки: Индекс может предотвратить операции сортировки ORDER BY, если порядок сортировки совпадает с порядком колонок в индексе.
  4. Эффективные запросы с диапазонами: При использовании операторов BETWEEN, >, < на первой колонке индекса, последующие колонки могут использоваться для фильтрации.

Ограничения и лучшие практики

  • Порядок колонок критичен: Колонки в индексе должны следовать в порядке от наиболее селективной (с высокой уникальностью) к наименее селективной для общих запросов. Например, в (country, city, street) запрос по country и city будет эффективен, а только по street — нет.
  • Правило левого префикса (Leftmost Prefix): В большинстве СУБД (например, MySQL, PostgreSQL) индекс может использоваться, только если запрос включает префиксные колонки индекса слева направо. Например, для индекса (A, B, C) эффективны запросы с A, A и B, A и B и C, но не с B или C отдельно.
  • Баланс с производительностью записи: Каждый индекс замедляет операции INSERT, UPDATE, DELETE, так как индексные структуры (обычно B-деревья) требуют обновления. Составные индексы создают дополнительную нагрузку.
  • Анализ запросов: При проектировании индексов анализируйте частые запросы в приложении с помощью EXPLAIN (в MySQL) или EXPLAIN ANALYZE (в PostgreSQL), чтобы понять, какие индексы действительно нужны.

Пример в контексте PHP-приложения

В backend-приложении на PHP, работающем с базой данных, составные индексы помогают ускорить операции, например, поиск пользователей по имени и фамилии или фильтрацию заказов по статусу и дате. Вот как это может выглядеть в коде с использованием PDO:

// Предположим, у нас есть таблица orders с колонками status, created_at, user_id
// Создали индекс: CREATE INDEX idx_status_created ON orders (status, created_at);

$pdo = new PDO('mysql:host=localhost;dbname=shop', 'user', 'password');
$status = 'processing';
$date = '2023-10-01';

// Запрос использует составной индекс эффективно
$stmt = $pdo->prepare("SELECT * FROM orders WHERE status = :status AND created_at > :date ORDER BY created_at");
$stmt->execute([':status' => $status, ':date' => $date]);
$orders = $stmt->fetchAll(PDO::FETCH_ASSOC);

// Для анализа использования индекса можно выполнить EXPLAIN
$explainStmt = $pdo->query("EXPLAIN SELECT * FROM orders WHERE status = 'processing' AND created_at > '2023-10-01'");
$explainResult = $explainStmt->fetch(PDO::FETCH_ASSOC);
// Проверяем ключ (key) в результате - должен быть idx_status_created

Заключение

Составные индексы — это мощный механизм оптимизации баз данных, но они требуют продуманного проектирования. Ключевые моменты: порядок колонок, учёт левого префикса и анализ реальных запросов. Правильное их применение может значительно повысить производительность Backend-приложения, снижая время отклика и нагрузку на базу данных. Однако избыточные индексы могут ухудшить производительность записи, поэтому всегда балансируйте между чтением и записью.

Что такое составные индексы? | PrepBro