EXPLAIN pokazuje plan wybrany przez optymalizator — jak uzyska dostęp do każdej tabeli — bez uruchamiania zapytania. Czytasz go, aby potwierdzić, że indeksy są używane i że przetwarzana jest niewielka liczba wierszy.
EXPLAIN pokazuje plan wybrany przez optymalizator — jak uzyska dostęp do każdej tabeli — bez uruchamiania zapytania. Czytasz go, aby potwierdzić, że indeksy są używane i że przetwarzana jest niewielka liczba wierszy.
const / eq_ref / ref (wyszukiwania po indeksie, dobrze) → range → index (pełne skanowanie indeksu) → ALL (pełne skanowanie tabeli, czerwona flaga).NULL = żaden).Using index (pokrywający, świetnie), Using filesort / Using temporary (sortowanie/grupowanie w pamięci lub na dysku — często do zoptymalizowania).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 zamienił skan ALL obejmujący 900 tys. wierszy w wyszukiwanie ref obejmujące 30, a ponieważ created_at jest drugą kolumną, wiersze wychodzą wstępnie posortowane — filesort znika.
Użyj EXPLAIN ANALYZE (MySQL 8), aby zobaczyć również rzeczywiste czasy i liczby wierszy, wychwytując przypadki, w których szacunek jest błędny.
EXPLAIN to sposób, w jaki zastępujesz zgadywanie dowodami. Wypatrzenie type: ALL, ogromnej wartości rows lub Using filesort mówi dokładnie, gdzie brakuje indeksu — to najszybsza droga od „strona jest wolna" do celowanej poprawki.
Biblioteka pytań rekrutacyjnych IT ze szczegółowymi odpowiedziami — od Juniora do Seniora.
Wesprzyj