Ответ
Автоматически (по умолчанию) индексы создаются для полей с определенными ограничениями целостности (constraints). Конкретное поведение может незначительно отличаться между СУБД.
Стандартное поведение:
- PRIMARY KEY: На поле (или набор полей), объявленное как первичный ключ, всегда создается уникальный индекс. Во многих СУБД (MySQL/InnoDB, SQL Server, Oracle) это кластерный индекс (данные физически упорядочены по этому ключу).
- 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.