2009-07-27 9 views
6

Potrzebuję prostego sposobu na przetestowanie zapytań SQL pod kątem szybkości. Nie martwię się o różnice sprzętowe, potrzebuję w zasadzie względnej liczby.Jak testować szybkość zapytań MySQL, z mniejszymi niespójnościami?

To, co robiłem z PHP (jego rozmyte, ale działa):

// CONNECT TO DB HERE 

$sub = new YomoSubscription(95,783); 

$t = microtime(TRUE); 

// contains the SQL db call i'm testing 
$fp = $sub->generateFingerprint(); 

echo microtime(TRUE)-$t; 

PROBLEM mam jest to, że czasami na początkowy connect/uruchomić mój testu trwa 1.25 sek na przykład. Jednak na kolejnych połączeniach trwa 0,004 s ... Dlaczego to jest?

jestem całkiem pewien MySQL zapytanie cache jest wyłączony w my.ini:

query_cache_size=0 

Odpowiedz

4

Twoje pierwsze zapytanie może być wolniejsze, ponieważ MySQL faktycznie trafia na dysk pierwszego zapytania, a nie na drugie.

Twój system operacyjny może buforować pliki w pamięci podczas ich odczytu; w rezultacie kolejne odczyty mogą nie wymagać trafienia na dysk i będą zwracane znacznie szybciej.

Zgodnie z ogólną zasadą generalnie generuję zapytanie kilka razy i szukam spójności. Częściej niż nie, pierwszy bieg potrwa kilka razy dłużej, podczas gdy drugi i trzeci będzie zajmował mniej więcej tyle samo czasu. Te kolejne przebiegi są prawdopodobnie bardziej reprezentatywne dla wydajności, jaką zobaczysz w rzeczywistym systemie produkcyjnym - ponieważ twoja baza danych produkcji powinna przechowywać te dane w pamięci podręcznej systemu operacyjnego, podczas gdy twój system dev jest rzadko dostępny.

Podsumowując, jeśli chodzi o wydajność zapytań, w przeważającej części, powinieneś po prostu przyspieszyć programowanie i monitorować powolny dziennik zapytań w produkcji, aby sprawdzić, które zapytania naprawdę wymagają pracy.

Jeśli chodzi o uruchamianie programistyczne zapytań dotyczących danych o wydajności, należy pobrać kilka próbek i użyć mediany. Ale w praktyce nie będzie to bardzo reprezentatywne dla rzeczywistych problemów z wydajnością, z jakimi można się spotkać podczas produkcji.

0

Może być używanie trwałych połączeń w klasie. Pconnect ponownie użyje połączenia i uwzględni ten typ opóźnienia.

2

Załóżmy, że:

  1. nie używasz połączenia Persistant
  2. zainstalowany na serwerze, gdzie statystyki są wykonywane (brak połączenia sieciowego)
  3. nikt inny nie korzysta z bazy danych (wiersza w bazie danych/blokad stołowych)
  4. Żaden inny ciężki proces nie jest uruchomiony
  5. itp ....

Jeśli naprawdę chcesz do benchmarku zapytanie, należy wykonać następujące czynności:

$database->query('SET SESSION query_cache_type = OFF'); 

Następnie należy uruchomić kwerendę 2-3 razy w pętli (na „rozgrzanie” serwer) .

I dopiero wtedy:

$database->query('FLUSH STATUS'); #If you use the stats to profile your query 

$t = microtime(TRUE); 
$fp = $sub->generateFingerprint(); 
echo microtime(TRUE)-$t; 

$database->query('SHOW STATUS'); 

Et voila !! :)))

BTW, prędkość zapytania jest jednym z parametrów do odczytu. Dowiedz się, jak odczytać bardzo cenne informacje zwrócone przez SHOW STATUS i EXPLAIN .... To będzie dużo lepsze.

Oto link pokochasz: http://www.xaprb.com/blog/2006/10/12/how-to-profile-a-query-in-mysql/

Enjoy. :)