EXPLAIN prikaže načrt, ki ga je izbral optimizator — kako bo dostopal do vsake tabele — brez izvajanja poizvedbe. Berete ga, da potrdite, ali so indeksi uporabljeni in ali se pregleduje malo vrstic.
EXPLAIN prikaže načrt, ki ga je izbral optimizator — kako bo dostopal do vsake tabele — brez izvajanja poizvedbe. Berete ga, da potrdite, ali so indeksi uporabljeni in ali se pregleduje malo vrstic.
const / eq_ref / ref (iskanja po indeksu, dobro) → range → index (popolno pregledovanje indeksa) → ALL (popolno pregledovanje tabele, rdeča zastavica).NULL = noben).Using index (pokrivno, odlično), Using filesort / Using temporary (razvrščanje/združevanje v pomnilniku ali na disku — pogosto optimizabilno).EXPLAIN SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at;
-- +------+------+------+---------+--------+----------------+
-- | type | key | rows | Extra |
-- | ALL | NULL | 900k | Using where; Using filesort | <- scans everything, sorts
-- +------+------+------+---------+--------+----------------+
-- Add an index that covers the filter AND the sort order:
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 | <- seeks 30 rows, no filesort
Indeks je pregledovanje ALL čez 900 tisoč vrstic spremenil v iskanje ref po 30 vrsticah, in ker je created_at drugi stolpec, vrstice pridejo že razvrščene — filesort izgine.
Uporabite EXPLAIN ANALYZE (MySQL 8), da vidite tudi dejansko časovno merjenje in števila vrstic ter ujamete primere, kjer je ocena napačna.
EXPLAIN je način, kako ugibanje zamenjate z dokazi. Opazovanje type: ALL, ogromnega rows ali Using filesort vam natančno pove, kje manjka indeks — najhitrejša pot od "stran je počasna" do ciljno usmerjenega popravka.
Knjižnica IT vprašanj za razgovore s podrobnimi odgovori — od začetnika do izkušenega.
Doniraj