Создается ли индекс автоматически при объявлении первичного ключа (PRIMARY KEY)?

«Создается ли индекс автоматически при объявлении первичного ключа (PRIMARY KEY)?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в подавляющем большинстве реляционных СУБД при создании ограничения PRIMARY KEY автоматически создается уникальный индекс. Это необходимо для обеспечения уникальности и быстрого поиска по первичному ключу.

Как это работает в разных СУБД:

  • MySQL / PostgreSQL / SQLite: Создается UNIQUE INDEX с тем же именем, что и у первичного ключа.
    CREATE TABLE users (
        id INT PRIMARY KEY, -- Автоматически создаст уникальный индекс на id
        name VARCHAR(100)
    );
  • Oracle: Также автоматически создается уникальный индекс. Можно явно указать табличное пространство для индекса.
  • SQL Server: По умолчанию создается кластерный индекс (clustered index), что означает, что данные в таблице физически упорядочены по первичному ключу. Это можно изменить, указав NONCLUSTERED.
    CREATE TABLE users (
        id INT PRIMARY KEY NONCLUSTERED, -- Явно создаст некластерный индекс
        name VARCHAR(100)
    );

Практические следствия:

  1. Не создавайте индекс вручную: Дополнительный индекс CREATE INDEX idx_id ON users(id) будет избыточным и станет бесполезной нагрузкой на систему при вставке/обновлении.
  2. В JPA/Hibernate: При использовании @Id или @EmbeddedId для определения первичного ключа, создаваемая схема БД также будет содержать соответствующий индекс (если DDL-генерация включена).
  3. Составной первичный ключ: Для PRIMARY KEY (col1, col2) также создается составной уникальный индекс на (col1, col2).

Исключение: Некоторые СУБД (как старые версии) или особые конфигурации могут требовать явного создания индекса, но в современной Java-экосистеме это крайне редкий случай.