Какие индексы создаются в реляционных СУБД автоматически при определении схемы таблицы?

Ответ

В большинстве реляционных СУБД (как PostgreSQL, MySQL) индексы создаются автоматически для обеспечения выполнения ограничений целостности (constraints), которые требуют быстрых проверок на уникальность.

Основные случаи автоматического создания индексов:

  1. PRIMARY KEY (Первичный ключ)

    • Всегда создает уникальный индекс (обычно B-Tree). Это необходимо для быстрого поиска строк по ключу и для гарантии его уникальности.
  2. UNIQUE (Ограничение уникальности)

    • Всегда создает уникальный индекс для столбца или группы столбцов, чтобы эффективно проверять отсутствие дубликатов перед INSERT или UPDATE.
  3. FOREIGN KEY (Внешний ключ)

    • Зависит от СУБД! Это важный нюанс.
    • PostgreSQL: Не создает индекс для внешнего ключа автоматически. Его рекомендуется создавать вручную, чтобы избежать проблем с производительностью при JOIN или DELETE связанных записей.
    • MySQL (InnoDB): Создает индекс для внешнего ключа автоматически.

Пример для PostgreSQL:

CREATE TABLE users (
    id SERIAL PRIMARY KEY, -- Автоматически создается B-Tree индекс для id
    email VARCHAR(100) UNIQUE, -- Автоматически создается B-Tree индекс для email
    company_id INT REFERENCES companies(id) -- Индекс для company_id НЕ создается автоматически!
);

-- Рекомендуется создать его вручную:
CREATE INDEX idx_users_company_id ON users (company_id);