Jak używać EXPLAIN to * predict* performance of a MySQL query?

Pomagam w utrzymaniu programu, który jest zasadniczo przyjaznym interfejsem tylko do odczytu dla dużej i skomplikowanej bazy danych MySQL - program buduje zapytania ad-hoc SELECT z danych wejściowych użytkowników, wysyła zapytania do bazy danych, pobiera wyniki, przetwarza je i ładnie wyświetla użytkownikowi.

Chciałbym dodać jakąś formę rozsądnej / heurystycznej prognozy oczekiwanej wydajności konstruowanego zapytania -- Czasami użytkownicy niechcący dokonują zapytań, które nieuchronnie idą aby zająć bardzo dużo czasu (ponieważ zwrócą ogromne zestawy wyników, lub ponieważ" idą pod prąd "sposobu, w jaki DB jest indeksowany) i chciałbym być w stanie wyświetlić użytkownikowi" nieco wiarygodne " informacje/zgadywać, jak długo zajmie zapytanie. Nie musi być idealny, o ile nie jest tak źle i często nie wychodzi z rzeczywistości, aby wywołać efekt "płaczącego wilka", w którym użytkownicy uczą się go lekceważyć;-) na podstawie tych informacji użytkownik może zdecydować się na napij się kawy (jeśli kosztorys wynosi 5-10 minut), idź na lunch (jeśli to 30-60 minut), Zabij zapytanie i spróbuj czegoś innego (może ściślejsze limity informacji, o które proszą) itp., itp.

Nie jestem zbyt zaznajomiony z wyjaśnieniem MySQL-widzę wiele informacji na temat tego, jak go używać do optymalizacji zapytania lub schematu DB, indeksowania itp., ale nie wiele na temat tego, jak go używać do mojego bardziej ograniczonego celu-po prostu zrób prognozę, biorąc DB jako dane (z oczywiście, jeśli przewidywania są wystarczająco wiarygodne, mogę w końcu przełączyć się na ich używanie, aby wybrać między alternatywnymi formami, które może podjąć zapytanie, ale to na przyszłość: na razie byłbym bardzo szczęśliwy, aby pokazać użytkownikom zgadywanie wydajności dla wyżej wymienionych celów).

Dowolne wskaźniki...?

Author: Alex Martelli, 2009-04-25

3 answers

EXPLAIN nie daje żadnych wskazówek, jak długo zapytanie będzie trwało. W najlepszym razie możesz go użyć, aby odgadnąć, które z dwóch zapytań może być szybsze, ale jeśli jedno z nich nie jest oczywiście źle napisane, to nawet to będzie bardzo trudne.

Powinieneś również mieć świadomość, że jeśli używasz zapytań podrzędnych, nawet uruchamianie EXPLAIN może być powolne (w niektórych przypadkach prawie tak samo powolne jak samo zapytanie).

Z tego co mi wiadomo, MySQL nie daje możliwości oszacowania czasu, jaki zajmie zapytanie uciekaj. Czy możesz zarejestrować czas potrzebny na uruchomienie każdego zapytania, a następnie zbudować oszacowanie na podstawie historii wcześniejszych podobnych zapytań?

 20
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-25 19:10:24

Myślę, że jeśli chcesz mieć szansę na zbudowanie czegoś w miarę wiarygodnego z tego, co powinieneś zrobić, to zbudować model statystyczny z rozmiarów tabel i rozbite objaśnić składniki wyników skorelowane z czasem przetwarzania zapytań. Próba zbudowania predyktora czasu wykonywania zapytań w oparciu o myślenie o Zawartość wyjaśnienia będzie po prostu spędzać zbyt długo dając żenująco słabe wyniki, zanim zostanie dopracowana do niejasnej użyteczności.

 11
Author: chaos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-19 14:24:00

MySQL EXPLAIN ma kolumnę o nazwie Key. Jeśli jest coś w tej kolumnie, jest to bardzo dobre wskazanie, to znaczy, że zapytanie użyje indeksu.

Zapytania, które używają wskaźników, są na ogół bezpieczne w użyciu, ponieważ prawdopodobnie zostały przemyślane przez projektanta bazy danych, gdy projektował bazę danych.

Jednakże

Istnieje inne pole o nazwie Extra. Pole to czasami zawiera tekst using_filesort.

To jest bardzo bardzo złe. To dosłownie oznacza, że MySQL wie, że zapytanie będzie miało ustawiony wynik większy niż dostępna pamięć, a zatem zacznie zamieniać dane na dysk w celu ich sortowania.

Wniosek

Zamiast próbować przewidzieć czas , wystarczy spojrzeć na te dwa wskaźniki. Jeśli zapytanie to using_filesort, Odrzuć użytkownika. I w zależności od tego, jak ścisłe chcesz być, jeśli zapytanie nie używa żadnych kluczy, należy również zaprzeczyć.

Przeczytaj więcej o resultset z MySQL EXPLAIN

 3
Author: firelynx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 13:33:32