← Назад к вопросам

На какие поля создаются индексы по умолчанию

1.0 Junior🔥 151 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

На какие поля создаются индексы по умолчанию

Краткий ответ

По умолчанию индексы создаются:

  • Primary Key (PRIMARY INDEX) — уникальный индекс на первичный ключ
  • UNIQUE констрейнты — создают уникальные индексы автоматически

Остальные индексы создаются явно по запросу разработчика.

Primary Key индекс

Автоматически создаётся индекс на первичный ключ:

CREATE TABLE users (
    id INTEGER PRIMARY KEY,  -- Индекс создан АВТОМАТИЧЕСКИ
    name VARCHAR(100),
    email VARCHAR(100)
);

В PostgreSQL:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,  -- Индекс users_pkey создан
    name VARCHAR(100)
);

В MySQL:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,  -- Индекс создан
    name VARCHAR(100)
);

UNIQUE констрейнты

В большинстве СУБД UNIQUE констрейнты автоматически создают индексы:

CREATE TABLE users (
    id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE  -- Индекс создан автоматически
);

Это необходимо для обеспечения уникальности на уровне СУБД.

Foreign Key (FK)

НЕ создаёт индекс по умолчанию:

CREATE TABLE posts (
    id INT PRIMARY KEY,
    user_id INT REFERENCES users(id)  -- Индекс НЕ создан!
);

Приходится создавать явно:

CREATE INDEX idx_posts_user_id ON posts(user_id);

Что НЕ индексируется по умолчанию

CREATE TABLE posts (
    id INT PRIMARY KEY,           -- ИНДЕКСИРОВАН (PK)
    user_id INT,                  -- НЕ индексирован
    title VARCHAR(100),           -- НЕ индексирован
    content TEXT,                 -- НЕ индексирован
    created_at TIMESTAMP,         -- НЕ индексирован
    FOREIGN KEY (user_id) REFERENCES users(id)
);

Для оптимизации нужны явные индексы:

CREATE INDEX idx_user_id ON posts(user_id);
CREATE INDEX idx_created_at ON posts(created_at);

Практический пример

CREATE TABLE products (
    id INT PRIMARY KEY,              -- Индекс: PRIMARY
    sku VARCHAR(50) UNIQUE,          -- Индекс: UNIQUE (авто)
    category_id INT,                 -- НЕ индексирован
    name VARCHAR(100),               -- НЕ индексирован
    price DECIMAL(10, 2),            -- НЕ индексирован
    created_at TIMESTAMP,            -- НЕ индексирован
    FOREIGN KEY (category_id) REFERENCES categories(id)
);

-- Добавляем необходимые индексы
CREATE INDEX idx_category ON products(category_id);
CREATE INDEX idx_created_at ON products(created_at);

Сложные индексы

Индексы по нескольким полям создаются явно:

-- Композитный индекс
CREATE INDEX idx_user_created ON posts(user_id, created_at);

-- Индекс с условием
CREATE INDEX idx_active ON users(id) WHERE status = active;

Проверка индексов

PostgreSQL:

SELECT * FROM pg_indexes WHERE tablename = users;

MySQL:

SHOW INDEX FROM users;

Важные моменты

  1. PK и UNIQUE — индексы автоматические
  2. FK — индекс на поле НЕ создаётся, нужен явный
  3. Остальные поля — индексы только по запросу
  4. Performance — без индексов на часто фильтруемые поля = медленные запросы

Backend-оптимизация

// Плохо — нет индекса
SELECT * FROM posts WHERE user_id = ? AND created_at > ?

// Хорошо — нужен индекс
CREATE INDEX idx_user_created ON posts(user_id, created_at);