На какие поля таблицы в SQL-базе данных индексы создаются по умолчанию?

«На какие поля таблицы в SQL-базе данных индексы создаются по умолчанию?» — вопрос из категории Базы данных, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Автоматически (по умолчанию) индексы создаются для полей с определенными ограничениями целостности (constraints). Конкретное поведение может незначительно отличаться между СУБД.

Стандартное поведение:

  1. PRIMARY KEY: На поле (или набор полей), объявленное как первичный ключ, всегда создается уникальный индекс. Во многих СУБД (MySQL/InnoDB, SQL Server, Oracle) это кластерный индекс (данные физически упорядочены по этому ключу).
  2. UNIQUE CONSTRAINT: На поле с ограничением UNIQUE создается уникальный некластерный индекс.

Пример на SQL (общий синтаксис):

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,         -- Будет создан уникальный (часто кластерный) индекс
    Email VARCHAR(100) UNIQUE NOT NULL, -- Будет создан уникальный индекс
    FirstName VARCHAR(50) NOT NULL,     -- Индекс НЕ создается автоматически
    LastName VARCHAR(50) NOT NULL
);

Нюансы для популярных СУБД:

  • MySQL (InnoDB): Кластерный индекс создается по PRIMARY KEY. Если PRIMARY KEY не задан, используется первый UNIQUE ключ, где все столбцы имеют признак NOT NULL. Если и такого нет, InnoDB создает скрытое 6-байтное поле для кластерного индекса.
  • PostgreSQL: Создает уникальные индексы для PRIMARY KEY и UNIQUE. По умолчанию индексы в PostgreSQL — некластерные. Команда CLUSTER может физически переупорядочить таблицу по индексу, но это не поддерживается автоматически.
  • SQL Server: Создает уникальный кластерный индекс для PRIMARY KEY, если явно не указано NONCLUSTERED. Для UNIQUE по умолчанию создается некластерный индекс.

Индексы для FOREIGN KEY не создаются автоматически стандартом SQL, но их часто рекомендуется создавать вручную для ускорения операций JOIN.