2009-07-27 5 views
6

Ich brauche eine einfache Möglichkeit, SQL-Abfragen auf Geschwindigkeit zu testen. Ich bin nicht besorgt über Hardware-Unterschiede, ich brauche im Grunde eine relative Nummer.Wie testen MySQL MySQL-Abfrage Geschwindigkeit mit weniger Inkonsistenzen?

Dies ist, was ich habe mit PHP zu tun (seinem flockig, aber funktioniert):

// 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; 

Das PROBLEM ich habe, ist, dass manchmal bei der erstmaligen Verbinden/meinen Testlauf 1,25 sec dauert beispielsweise. Bei nachfolgenden Verbindungen dauert es jedoch 0,004 Sekunden ... Warum ist das?

Ich bin ziemlich sicher, dass MySQL Query Cache off in my.ini ist:

query_cache_size=0 

Antwort

4

Ihre erste Abfrage kann langsamer sein, da MySQL die Festplatte bei der ersten Abfrage und nicht bei der zweiten Abfrage trifft.

Ihr Betriebssystem kann Dateien im Speicher zwischenspeichern, während sie gelesen werden. Infolgedessen müssen nachfolgende Lesevorgänge möglicherweise nicht auf die Festplatte treffen und werden viel schneller zurückgeben.

Als Faustregel kann ich im Allgemeinen eine Abfrage mehrmals ausführen und nach Konsistenz suchen. Meistens dauert der erste Lauf mehrere Male länger, während der zweite und der dritte ungefähr gleich lang dauern. Diese nachfolgenden Ausführungen sind wahrscheinlich repräsentativer für die Art von Leistung, die Sie auf einem tatsächlichen Produktionssystem sehen werden - da Ihre Produktionsdatenbank diese Daten im Betriebssystemcache speichern sollte, während auf Ihr Entwicklungssystem nur selten zugegriffen wird.

Am Ende, wenn es Leistung zur Abfrage kommt, zum größten Teil sollten Sie es nur einen schnellen Pass in der Entwicklung geben, und das Log für langsame Abfragen in der Produktion überwachen, um zu sehen, welche Arbeit wirklich brauchen abfragt.

Soweit programmatisch Abfragen für Leistungsdaten ausgeführt wird - nehmen Sie mehrere Beispiele und verwenden Sie den Median. In der Praxis wird dies jedoch nicht wirklich repräsentativ für die tatsächlichen Leistungsprobleme sein, mit denen Sie in der Produktion konfrontiert werden.

0

Sie könnten Verwenden von persistenten Verbindungen in Ihrer Klasse. Ein pconnect wird die Verbindung wiederverwenden und diese Art von Verzögerung berücksichtigen.

2

Lassen Sie uns davon ausgehen, dass:

  1. Sie persistente nicht-Verbindung verwenden
  2. die Datenbank auf dem Server installiert, auf dem die Statistiken gemacht werden (keine Netzwerkverbindung)
  3. sonst niemand die Datenbank mit (row/Tischschlösser)
  4. kein anderer schwerer Prozess läuft
  5. etc ....

Wenn Sie wirklich Benchmark Ihrer Anfrage möchten, müssen Sie Folgendes tun:

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

Dann führen Sie die Abfrage 2-3 mal in einer Schleife (zum „Aufwärmen“ der Server) .

Und nur dann:

$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'); 

voila Et !! :)))

BTW, Abfragegeschwindigkeit ist einer der Parameter zu lesen. Erfahren Sie, wie Sie die sehr wertvollen Informationen lesen können, die von SHOW STATUS und EXPLAIN ... zurückgegeben werden. Das wird viel besser sein.

Hier ist ein Link, den Sie lieben werden: http://www.xaprb.com/blog/2006/10/12/how-to-profile-a-query-in-mysql/

Genießen. :)

Verwandte Themen