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