← Назад к вопросам
На какие поля создаются индексы по умолчанию
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;
Важные моменты
- PK и UNIQUE — индексы автоматические
- FK — индекс на поле НЕ создаётся, нужен явный
- Остальные поля — индексы только по запросу
- Performance — без индексов на часто фильтруемые поля = медленные запросы
Backend-оптимизация
// Плохо — нет индекса
SELECT * FROM posts WHERE user_id = ? AND created_at > ?
// Хорошо — нужен индекс
CREATE INDEX idx_user_created ON posts(user_id, created_at);