EXPLAIN показує, як база збирається виконати запит: у якому порядку читати таблиці, чи використовувати індекси, як з'єднувати. Сам запит при цьому не виконується.
EXPLAIN SELECT * FROM orders WHERE user_id = 5;
Index Scan using orders_user_id_idx on orders (cost=0.43..8.45 rows=3 width=64)
Index Cond: (user_id = 5)
Що шукати новачку:
Seq Scan(PostgreSQL) /type: ALL(MySQL) на великій таблиці - повний перегляд таблиці. Часто ознака відсутнього індексу.Index Scan/Index Only Scan(PostgreSQL),type: ref,range(MySQL) - використано індекс.rows- скільки рядків база очікує. Якщо оцінка сильно відрізняється від реальності, план може бути поганим.Sortз великою кількістю рядків чиUsing filesortу MySQL - сортування, яке не взяли з індексу.
cost - умовні одиниці вартості, не мілісекунди. Перше число - вартість до першого рядка, друге - до останнього.
План читають знизу вгору й зсередини назовні: вкладені вузли виконуються першими й передають рядки батьківському.
Наступний крок - EXPLAIN ANALYZE, який виконує запит і показує реальний час і кількість рядків.