EXPLAIN показывает план, выбранный оптимизатором — как он будет обращаться к каждой таблице — не выполняя запрос. Вы читаете его, чтобы подтвердить, что индексы используются и что просматривается мало строк.
EXPLAIN показывает план, выбранный оптимизатором — как он будет обращаться к каждой таблице — не выполняя запрос. Вы читаете его, чтобы подтвердить, что индексы используются и что просматривается мало строк.
const / eq_ref / ref (поиски по индексу, хорошо) → range → index (полное сканирование индекса) → ALL (полное сканирование таблицы, тревожный сигнал).NULL = никакой).Using index (покрывающий, отлично), Using filesort / Using temporary (сортировка/группировка в памяти или на диске — часто оптимизируется).EXPLAIN SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at;
-- +------+------+------+---------+--------+----------------+
-- | type | key | rows | Extra |
-- | ALL | NULL | 900k | Using where; Using filesort | <- сканирует всё, сортирует
-- +------+------+------+---------+--------+----------------+
-- Добавьте индекс, который покрывает фильтр И порядок сортировки:
CREATE INDEX idx_cust_created ON orders (customer_id, created_at);
EXPLAIN SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at;
-- | type | key | rows | Extra |
-- | ref | idx_cust_created | 30 | Using where | <- ищет 30 строк, без filesort
Индекс превратил сканирование ALL по 900 тыс. строк в поиск ref по 30, и поскольку created_at — второй столбец, строки выходят уже отсортированными — filesort исчезает.
Используйте EXPLAIN ANALYZE (MySQL 8), чтобы также увидеть фактическое время и количество строк, обнаруживая случаи, когда оценка ошибочна.
EXPLAIN — это то, как вы заменяете догадки доказательствами. Обнаружение type: ALL, огромного значения rows или Using filesort точно говорит вам, где отсутствует индекс — кратчайший путь от "страница медленная" к целенаправленному исправлению.
Библиотека вопросов для IT-собеседований с подробными ответами — от Junior до Senior.
Поддержать