MySQL: nieoptymalne zapytania (Slow Query Log)

logo-mysqlWydajność, to w przypadku serwera www rzecz kluczowa. Pomimo wykorzystania dobrego sprzętu oraz dostosowania konfiguracji serwera do warunków w jakich będzie pracował, każdy serwer można zabić nieoptymalnymi zapytaniami.

Błąd w zapytaniu SQL popełnić można bardzo łatwo. Jedno nieoptymalne zapytanie może powodować spadek wydajności serwera, backlogi lub całkowitą odmowę działania. Optymalne zapytania są ważne szczególnie w przypadku tabel typu MyISAM. Powodem jest blokowanie na poziomie tabeli, a nie jak to jest w przypadku InnoDB – na poziomie wiersza.

Z pomocą przychodzi nam jeden z wewnętrznych mechanizmów MySQL – Slow Query Log. Działa on w ten sposób, że zapytania których czas wykonania przekracza wskazaną długość, są zapisywane do pliku. Dzięki temu administratorzy serwerów baz danych, ale także programiści, mają doskonałe narzędzie kontroli. Czas wykonania po którym zapytanie zostanie uznane za „długie” możemy ustawiać według własnych potrzeb. I tak, administratorzy zapewne ustawią dłuższy czas, natomiast programiści powinni w tej kwestii być dla siebie surowi.

Włączenie tego mechanizmu jest stosunkowo łatwe i polega na dodaniu do pliku konfiguracyjnego serwera MySQL jednej lub dwóch linii. W przypadku Windows będzie to plik my.ini, w przypadku Linuksa my.cnf. Pierwsza z nich włącza mechanizm. Drugą ustawiamy czas, po którym zapytanie zostanie zapisane do pliku loga. Jeśli nie określimy tego czasu, zostanie użyta wartość domyślna, czyli 10 sekund.

log-slow-queries
long_query_time=1

W tym przypadku plik loga nazwany będzie według konwencji: [host_name]-slow.log. Możemy określić nazwę pliku, wtedy wpis do pliku konfiguracyjnego może wyglądać następująco:

log-slow-queries=c:/slow_sql.log
long_query_time=5

Przykładowy plik loga:

# Time: 100224 19:50:45
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 89.843750  Lock_time: 0.000000 Rows_sent: 6256088  Rows_examined: 3
use we;
SET timestamp=1267037445;
select * from places,employees,departments,votes;

MySQL od wersji 5.0 oferuje także opcję

log-slow-admin-statements

która loguje długie zapytania typowo administracyjne, takie jak: OPTIMIZE TABLE, ANALYZE TABLE oraz ALTER TABLE.

Zachęcam do zapoznania się z innymi opcjami logowania w MySQL, np. log-isam czy log-queries-not-using-indexes

Fork me on GitHub

3 comments

  1. Hello there! Quick question that’s completely off topic. Do you know how to make your site mobile friendly? My site looks weird when viewing from my iphone 4. I’m trying to find
    a theme or plugin that might be able to fix this problem.

    If you have any recommendations, please share. Appreciate it!

  2. #Konfiguracja w pliku my.ini (np dla używających WampServer pod Windowsem):
    long_query_time = 1
    slow_query_log = 1
    slow_query_log_file = „d:/slow_query_log.log”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *