EXPLAIN ANALYZE (Planul de Execuție în Timp Real) în MySQL

Măsurarea performanței reale a interogărilor în MySQL 8: costul estimat vs. timpul real de execuție, numărul de bucle și rânduri citite din cache.

Sintaxă
EXPLAIN ANALYZE SELECT * FROM comenzi JOIN clienti ON ...;

Comanda clasică EXPLAIN afișează doar estimările teoretice ale optimizatorului MySQL înainte de rulare. Începând cu MySQL 8.0.18, comanda EXPLAIN ANALYZE reprezintă cel mai avansat instrument de profilare a performanței: ea execută efectiv interogarea pe server, înregistrează timpul real în milisecunde petrecut în fiecare nod al planului și returnează un arbore vizual detaliat.

Rularea și interpretarea rezultatului EXPLAIN ANALYZE
EXPLAIN ANALYZE
SELECT c.nume, COUNT(o.id) AS total_comenzi
FROM clienti c
JOIN comenzi o ON c.id = o.client_id
WHERE c.tara = 'RO'
GROUP BY c.id;

-- REZULTAT FORMAT ARBORE:
-- -> Table scan on <temporary table>  (actual time=0.125..0.130 rows=50 loops=1)
--     -> Aggregate using temporary table  (actual time=0.120..0.122 rows=50 loops=1)
--         -> Nested loop inner join  (cost=45.20 rows=250) (actual time=0.045..0.095 rows=300 loops=1)
--             -> Index lookup on c using idx_tara (tara='RO') (cost=10.50 rows=50) (actual time=0.020..0.035 rows=50 loops=1)
--             -> Index lookup on o using idx_client_id (client_id=c.id) (cost=0.65 rows=5) (actual time=0.001..0.001 rows=6 loops=50)

Cum se citesc metricile din rezultat

  • cost=45.20 — Costul estimat de optimizator (unitate arbitrară bazată pe operațiuni I/O și CPU).
  • actual time=0.020..0.035 — Primul număr este timpul în milisecunde până la returnarea primului rând; al doilea număr este timpul până la returnarea tuturor rândurilor din acel nod.
  • rows=50 — Numărul real de rânduri produse de acel pas.
  • loops=50 — De câte ori a fost executată acea operațiune (de exemplu, o căutare repetată în buclă pentru fiecare client).

Atenție: Spre deosebire de EXPLAIN simplu, EXPLAIN ANALYZE execută interogarea! Dacă o rulezi pe o instrucțiune DELETE sau UPDATE, modificările vor fi aplicate efectiv în baza de date (rulează întotdeauna într-o tranzacție cu ROLLBACK la final pentru siguranță).