Индексы для распространённых запросов
Добавляйте индексы для самых частых запросов: по пользователю, дате и внешнему ключу, а влияние измеряйте с помощью EXPLAIN
«Индексы для распространённых запросов» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Что такое индекс?
Индекс — это отдельная структура данных на диске, которая позволяет базе данных находить строки по значению столбца без сканирования таблицы. Классическая реализация — B-дерево.
Индексы меняют скорость записи на скорость чтения
Каждый индекс немного замедляет INSERT/UPDATE/DELETE (индекс тоже нужно обновлять). Не добавляйте ненужные индексы.
Первичные ключи получают индекс автоматически
Объявление PRIMARY KEY автоматически создаёт уникальный индекс B-дерева. То же происходит со столбцами UNIQUE.
Индексируйте столбцы внешних ключей
PostgreSQL НЕ создаёт индекс автоматически на стороне потомка внешнего ключа. Всегда добавляйте его — без него удаление родительской строки сканирует всех потомков:
CREATE INDEX comments_post_id_idx ON comments(post_id);
CREATE INDEX comments_author_id_idx ON comments(author_id);Индексируйте столбцы, используемые в WHERE
Если Вы часто фильтруете по created_at, проиндексируйте этот столбец:
CREATE INDEX posts_created_at_idx ON posts(created_at DESC);
-- Query benefits:
SELECT * FROM posts ORDER BY created_at DESC LIMIT 20;Составные индексы
Для фильтров по нескольким столбцам составной индекс может быть намного быстрее двух отдельных индексов:
CREATE INDEX posts_author_published_idx
ON posts(author_id, published_at DESC);
-- This query uses the index for both filter and sort:
SELECT * FROM posts
WHERE author_id = 42
ORDER BY published_at DESC LIMIT 10;Правило левого префикса
Составной индекс (a, b, c) может обслуживать запросы WHERE a = ? и WHERE a = ? AND b = ?, но НЕ запрос WHERE b = ? сам по себе. Порядок важен.
Частичные индексы
Индексируйте только строки, которые Вы запрашиваете:
-- Only published posts:
CREATE INDEX posts_published_idx
ON posts(published_at DESC)
WHERE published_at IS NOT NULL;
-- Smaller index, faster lookups for the common case.Индексы выражений
Индексируйте результат функции от столбца:
CREATE INDEX users_email_lower_idx ON users(LOWER(email));
-- Query that uses it:
SELECT * FROM users WHERE LOWER(email) = LOWER($1);Не создавайте слишком много индексов
Практические правила:
- Индексируйте PK ✓ (автоматически)
- Индексируйте столбцы UNIQUE ✓ (автоматически)
- Индексируйте столбцы внешних ключей ✓
- Индексируйте столбцы, используемые в WHERE / JOIN / ORDER BY в часто выполняемых запросах
- Не индексируйте столбцы с очень низкой избирательностью (например, логический столбец с распределением 50/50)
Измеряйте с помощью EXPLAIN
До и после добавления индекса выполняйте EXPLAIN ANALYZE, чтобы проверить, использует ли его планировщик:
EXPLAIN ANALYZE
SELECT * FROM posts WHERE author_id = 42 ORDER BY published_at DESC LIMIT 10;Итоги
Для нашего блога: индексируйте внешние ключи (post_id в комментариях, author_id в публикациях и комментариях), а также (author_id, published_at DESC) в таблице публикаций для запросов «последние публикации пользователя».
Проверка знаний
Вы добавили внешний ключ orders.user_id REFERENCES users(id). Какой индекс следует создать, если он вообще нужен?
Часто задаваемые вопросы
Урок «Индексы для распространённых запросов» бесплатный?
Да — полный текст урока «Индексы для распространённых запросов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Индексы для распространённых запросов»?
Добавляйте индексы для самых частых запросов: по пользователю, дате и внешнему ключу, а влияние измеряйте с помощью EXPLAIN Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Индексы для распространённых запросов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Моделирование блога: пользователи, публикации, комментарии
- Выбор ключей и типов
- Индексы для распространённых запросов
- Заполнение базы данных тестовыми данными