2009-04-25 15 views
48

Pomagam w utrzymaniu programu, który jest w zasadzie przyjaznym dla czytelników front-endem dla dużej i skomplikowanej bazy danych MySQL - program buduje ad-hoc SELECT zapytania od danych wejściowych użytkowników, wysyła zapytania do DB, pobiera wyniki, przetwarza je i ładnie wyświetla z powrotem do użytkownika.Jak używać EXPLAIN do * przewidywania * wydajności zapytania MySQL?

Chciałbym dodać jakąś formę rozsądnej/heurystycznej prognozy dla oczekiwanego wykonania skonstruowanej kwerendy - czasami użytkownicy nieumyślnie robią zapytania, które nieuchronnie będą trwać bardzo długo (ponieważ zwrócą ogromne zestawy wyników, lub dlatego, że "idą przeciw ziarnu" sposobu indeksowania bazy danych) i chciałbym móc wyświetlić użytkownikowi "nieco wiarygodne" informacje/zgadnąć, jak długo potrwa zapytanie. Nie musi być perfekcyjna, o ile nie robi się tak źle i często nie ma nic wspólnego z rzeczywistością, co powoduje efekt "płaczącego wilka", gdy użytkownicy uczą się lekceważyć ;-) Na podstawie tych informacji użytkownik może zdecydować się na kawę (jeśli szacunek to 5-10 minut), pójść na lunch (jeśli zajmie to 30-60 minut), zabić zapytanie i spróbować czegoś innego (może być ściślejszym ograniczeniem informacji, których zażądają), itp, itd.

nie jestem bardzo obeznany z MySQL wyjaśniają oświadczenie - widzę wiele informacji wokół tego, jak go używać do optimize zapytanie lub schematu DB jest, indeksowanie, etc, ale nie wiele o tym, jak z niego korzystać w moim bardziej ograniczonym celu - po prostu zrób przewidywanie, biorąc DB jako dane (oczywiście, jeśli przewidywania są wystarczająco wiarygodne, mogę w końcu przejść do korzystania z nich również do wyboru między alternatywnymi formami a Zapytanie może zająć, ale to na przyszłość: na razie byłbym bardzo szczęśliwy, pokazując wyniki dla użytkowników w wyżej wymienionych celach).

Jakieś wskazówki ...?

Odpowiedz

20

Funkcja EXPLAIN nie podaje żadnych informacji o tym, jak długo potrwa zapytanie. W najlepszym razie można go użyć do odgadnięcia, które z dwóch zapytań może być szybsze, ale jeśli jedno z nich nie jest wyraźnie napisane, nawet to będzie bardzo trudne.

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

O ile mi wiadomo, MySQL nie zapewnia żadnego sposobu oszacowania czasu uruchomienia zapytania. Czy możesz zarejestrować czas potrzebny na uruchomienie każdego zapytania, a następnie zbudować oszacowanie na podstawie historii podobnych zapytań?

+1

nie generujemy sub-zapytań w tym czasie, tak aby nieco nie powinno być problemem. Ale dzięki za wskaźnik - i wiadomość, że nie ma dobrego sposobu na oszacowanie kosztu zapytania (złe wieści, ale lepiej się uczyć, zanim spędzę nieograniczony czas na ściganiu chimery!). –

+10

EXPLAIN jest niezwykle pomocny. Nie wiem, dlaczego to jest "odpowiedź". Kasy kasowej - im większa liczba wierszy, tym więcej operacji należy wykonać. Pokazuje również, które, jeśli w ogóle, indeksy są używane. Ma to kluczowe znaczenie dla wydajności SELECT. Jeśli chodzi o podzapytania, bardzo rzadko zdarza się, że są one rzeczywiście potrzebne - powinny być refaktoryzowane, gdy tylko jest to możliwe ze względu na jasność. –

11

Myślę, że jeśli chcesz mieć szansę zbudowania czegoś rozsądnie niezawodnego z tego, powinieneś zbudować model statystyczny z tabelarycznych rozmiarów i zepsutych komponentów wyników EXPLAIN skorelowanych z czasami przetwarzania zapytań. Próbując zbudować predefiniator czasu wykonania zapytania na podstawie , myśląc o zawartość EXPLAIN po prostu zbyt długo będzie wydawała zawstydzająco słabe wyniki, zanim zostanie dopracowana do niewyraźnej użyteczności.

2

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

Kwerendy, w których używane są wskaźniki, są generalnie bezpieczne, ponieważ zostały prawdopodobnie opracowane przez projektanta bazy danych, kiedy zaprojektował bazę danych.

Jednak

Jest inna dziedzina zwana Extra. To pole czasami zawiera tekst using_filesort.

To jest bardzo bardzo złe. To dosłownie oznacza, że ​​MySQL wie, że zapytanie będzie miało zbiór wyników większy niż dostępna pamięć, a zatem zacznie zamieniać dane na dysk, aby je posortować.

Wnioski

Zamiast próbować przewidzieć czaszapytanie potrzebny, wystarczy spojrzeć na tych dwóch wskaźników. Jeśli zapytanie to using_filesort, odmów udzielenia dostępu użytkownikowi. I w zależności od tego, jak surowo chcesz być, jeśli zapytanie nie używa żadnych kluczy, powinieneś także odmówić.

Czytaj więcej o wynikowego na MySQL EXPLAIN statement

Powiązane problemy