EXPLAIN i SHOW TABLE STATUS – czyli to, czego oko nie widzi.

Dziś przybliżę działanie tych dwóch komend w MySQL. Zacznę od EXPLAIN.
Najprościej można wytłumaczyć jej działanie tak: „Wytłumacz mi, co się dzieje w tym zapytaniu”, a jego budowa jest następująca: EXPLAIN SELECT… i dalsza część zapytania. Wiem, że teoria jest nudna, więc przejdę od razu do przykładu, który znalazłem na jednym z blogów:

mysql> EXPLAIN SELECT first_name, last_name, title FROM film LEFT OUTER JOIN film_actor USING (film_id) LEFT OUTER JOIN actor USING (actor_id) WHERE first_name='PENELOPE' AND last_name='GUINESS' ORDER BY title DESC;
+----+-------------+------------+--------+-----------------------------+---------------------+---------+---------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+--------+-----------------------------+---------------------+---------+---------------------------+------+----------------------------------------------+
| 1 | SIMPLE | actor | ref | PRIMARY,idx_actor_last_name | idx_actor_last_name | 137 | const | 3 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | film_actor | ref | PRIMARY,idx_fk_film_id | PRIMARY | 2 | sakila.actor.actor_id | 1 | Using where; Using index |
| 1 | SIMPLE | film | eq_ref | PRIMARY | PRIMARY | 2 | sakila.film_actor.film_id | 1 | |
+----+-------------+------------+--------+-----------------------------+---------------------+---------+---------------------------+------+----------------------------------------------+
3 rows in set (0.00 sec)

Legenda:

  • select_type – typ SELECTu.
  • type – typ JOINu.
  • possible_key – klucze i indeksy, które MySQL możne wykorzystać.
  • key – klucze i indeksy, które zostały wykorzystane – MySQL stwierdził, że są najkorzystniejsza w tej sytuacji.
  • rows – ilość rekordów uznana przez MySQL za niezbędne do zbadania, aby wykonać dane zapytanie.
  • extra – dodatkowe informacje, o tym, jak MySQL rozwiąże to zapytanie. Sporo tego jest, więc nie będę się rozpisywał, tylko dam link do dokumentacji.

Jest jeszcze rozszerzona wersja tej komendy, czyli: EXPLAIN EXTENDED. Otrzymujemy wtedy dodatkową kolumnę: filtered. Informacja w niej zawarta to procentowa ilość rekordów, które zostaną przefiltrowane na podstawie warunków (choćby WHERE). Oznacza to, że pokazuje szacunkową liczbę rekordów badanych i „rekordy × filtrowane / 100” wskazuje liczbę rekordów, które zostaną połączone z poprzednimi tabelami (100% – wszystkie rekordy zostaną wykorzystane).

Teraz zasadnicze pytanie: „Po co to nam?!”. Otóż, jest to „zabawka” wydajnościowców. Dzięki temu sprawdzamy, gdzie tkwi problem długiego wykonywania się zapytania, gdzie warto dodać indeks, a gdzie warto przerobić całkowicie zapytanie. W przypadku powyższego przykładu, nałożony jest indeks tylko na last_name, a warunek WHERE dotyczy także first_name. Dodajcie indeks do first_name i zobaczcie, co się stanie 🙂 Oczywiście, im większa baza, tym bardziej obrazowe wyniki.

 

Teraz druga część, czyli SHOW TABLE STATUS. Szczegółowe informacje o tabelach. Dobra, do przykładu:

mysql> SHOW TABLE STATUS LIKE 'tabback'\G
*************************** 1. row ***************************
Name: tabback [nazwa]
Engine: InnoDB [silnik]
Version: 10 [wersja]
Row_format: Compact [typ składowania rekordów]
Rows: 1015689 [liczba rekordów]
Avg_row_length: 136 [średni rozmiar rekordu]
Data_length: 139100160 [rozmiar pliku danych]
Max_data_length: 0 [maksymalny rozmiar pliku]
Index_length: 212615168 [rozmiar pliku indeksów]
Data_free: 5242880 [wolne miejsce]
Auto_increment: 1000001 [następna wartość w auto increment]
Create_time: 2011-11-10 03:03:02 [data utworzenia]
Update_time: NULL [data aktualizacji; niektóre silniki pokazują NULL]
Check_time: NULL [data sprawdzenia; niektóre silniki pokazują NULL]
Collation: utf8_polish_ci [kodowanie znaków]
Checksum: NULL [suma kontrolna]
Create_options: [dodatkowe opcje użyte podczas tworzenia tabeli]
Comment: [komentarz]
1 row in set (0.01 sec)

Podobnie jak poprzednia komenda, tak i ta, dla zwykłego użytkownika jest mało istotna. Dla bardziej zaawansowanego użytkownika, jak najbardziej przydatna. Sprawdzenie wolnego miejsca, czy miejsce się zwolniło po usunięciu danych, ile miejsca zajmują indeksy, itp, itd. Możliwości wykorzystania jest dużo.

{ 0 komentarze… dodaj teraz swój }

Odpowiedź