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

Ответ

В большинстве реляционных СУБД (как 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);

Ответ 18+ 🔞

Давай разберём эту дичь про индексы, чтобы не было как с той Муму — утопили, а потом совесть заебала.

Смотри, в реляционных базах типа PostgreSQL или MySQL, индексы иногда создаются автоматом, как будто сами по себе, из воздуха. Но не просто так, а для того, чтобы быстро проверять всякие ограничения, чтобы целостность не проёбывать.

Вот основные моменты, когда база сама, без твоего ведома, натягивает индекс:

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

    • Тут без вариантов, ёпта. Индекс создаётся всегда, и обычно уникальный B-Tree. Иначе как она будет быстро искать строки и проверять, что ты не вставляешь второй раз одну и ту же хуйню? Без индекса это был бы пиздец.
  2. UNIQUE (Ограничение уникальности)

    • Тоже железно. Хочешь, чтобы в колонке email не было двух vasya@pupkin.ru? Для быстрой проверки «а нет ли уже такого?» перед каждым INSERT или UPDATE база обязана навесить уникальный индекс. Иначе она будет каждый раз всю таблицу сканировать — терпения ебать ноль.
  3. FOREIGN KEY (Внешний ключ)

    • А вот тут, сука, начинается цирк! Всё зависит от СУБД! Это тот самый подводный камень, о который все бьются.
    • PostgreSQL: Вежливый, но хитрый. Ограничение FOREIGN KEY создаст, а вот индекс для него — НЕТ, блядь. Его надо создавать ручками, иначе при джойнах или удалениях родительских записей производительность накроется медным тазом.
    • MySQL (InnoDB): Более предупредительный. Для внешнего ключа индекс создаётся автоматически. Но расслабляться не стоит.

Смотри, как это выглядит на практике в PostgreSQL:

CREATE TABLE users (
    id SERIAL PRIMARY KEY, -- Тут автоматом прилепится B-Tree индекс для id. Красота.
    email VARCHAR(100) UNIQUE, -- И тут тоже. За уникальностью email'ов будет следить индекс.
    company_id INT REFERENCES companies(id) -- А вот тут, сука, подстава! Ограничение есть, а индекса НЕТ!
);

-- Поэтому умные дяди всегда добавляют строчку:
CREATE INDEX idx_users_company_id ON users (company_id);
-- Вот теперь порядок. Не будь как Герасим, который потом метаться начал. Сделай сразу.

Короче, запомни: PRIMARY KEY и UNIQUE — за тебя всё сделают. А вот с FOREIGN KEY в Постгресе — будь начеку, сам создавай индекс, и не еби себе мозг потом.