← К оглавлению занятия

📖 Теория

📁 Блок: SQL / MySQL / Оптимизация ⏱️ Время изучения: ~90 мин 🎯 Сложность: Продвинутая

⚡ Кратко: теория

Оптимизация запросов нужна, чтобы уменьшить время выполнения и расход ресурсов базы данных.

Главный инструмент урока — индекс: структура данных, которая помогает быстрее находить строки без полного просмотра таблицы.

Ключевые команды: CREATE INDEX, CREATE UNIQUE INDEX, CREATE FULLTEXT INDEX, EXPLAIN.

Минимальный пример: CREATE INDEX idx_students_age ON students(age), затем EXPLAIN SELECT * FROM students WHERE age = 20.

Индекс полезен для частых фильтров, сортировок и группировок, но он занимает место и замедляет вставку, обновление и удаление.

Топ-3 ошибки: индексировать все столбцы подряд, не проверять план через EXPLAIN, ждать пользы от индекса на очень маленькой таблице.

Что такое оптимизация запросов

По источнику оптимизация запросов в MySQL направлена на повышение скорости и эффективности работы базы данных. Когда СУБД выполняет запрос, она тратит процессорное время, память и операции чтения.

Цель оптимизации — уменьшить количество используемых ресурсов и время выполнения запроса. Один из ключевых инструментов — индексация.

Что такое индекс

Индексация — способ организации данных, который ускоряет выполнение запросов. Индекс — структура данных, чаще всего дерево, которая помогает быстрее находить записи без полного сканирования всей таблицы.

Без индекса запрос WHERE age = 30 может читать каждую строку. С индексом по age MySQL может быстрее перейти к подходящим значениям.

Типы индексов в MySQL

ТипНазначениеПример
PRIMARY KEYУникальный первичный ключid INT PRIMARY KEY
UNIQUE INDEXЗапрещает дубликатыCREATE UNIQUE INDEX ...
INDEXОбычное ускорение поискаCREATE INDEX idx_age ON employees(age)
FULLTEXT INDEXПолнотекстовый поискCREATE FULLTEXT INDEX ...
COMPOSITE INDEXИндекс по нескольким столбцамCREATE INDEX idx_dep_age ON employees(department_id, age)

Минусы индексации

Источник подчёркивает три минуса: индексы занимают дисковое пространство, замедляют вставку/обновление/удаление и могут быть неэффективны на очень маленьких таблицах.

Практическое правило: индексируйте не «всё подряд», а столбцы, по которым часто фильтруют, сортируют или группируют данные.

EXPLAIN

EXPLAIN показывает, как MySQL будет выполнять запрос: какой тип сканирования планируется, сколько строк примерно будет прочитано, какой индекс будет использован.

EXPLAIN SELECT *
FROM employees
WHERE age = 30;

Смысл EXPLAIN — не просто увидеть красивую таблицу, а проверить гипотезу: помогает ли индекс конкретному запросу.

Проверить по документации: названия полей и подробность плана отличаются в MySQL, PostgreSQL и SQLite. Для PostgreSQL обычно используют EXPLAIN/EXPLAIN ANALYZE, для SQLite — EXPLAIN QUERY PLAN.