Ответ
В большинстве реляционных СУБД (как PostgreSQL, MySQL) индексы создаются автоматически для обеспечения выполнения ограничений целостности (constraints), которые требуют быстрых проверок на уникальность.
Основные случаи автоматического создания индексов:
PRIMARY KEY(Первичный ключ)- Всегда создает уникальный индекс (обычно B-Tree). Это необходимо для быстрого поиска строк по ключу и для гарантии его уникальности.
UNIQUE(Ограничение уникальности)- Всегда создает уникальный индекс для столбца или группы столбцов, чтобы эффективно проверять отсутствие дубликатов перед
INSERTилиUPDATE.
- Всегда создает уникальный индекс для столбца или группы столбцов, чтобы эффективно проверять отсутствие дубликатов перед
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);