2009-08-17 9 views
11

Wie würde ich die Anzahl der auf einer Seite geladenen SQL-Anfragen zählen?Anzahl der ausgeführten MySQL-Abfragen auf Seite

Ich habe ein ähnliches Skript zur Zeit für die Seite generiert werden, aber nicht für wie viele Abfragen ausgeführt wurden.

Sie wissen, was ich meine, wie auf SMF Foren, in der Fußzeile, sie haben:

Seite mit 7 Abfragen in 0,136 Sekunden erstellt.

in der Fußzeile?

Ersetzen aller mysql_query (s) ist nicht wirklich eine Option, es gibt viel zu viele mysql_queries zu ersetzen, obwohl ich einen Tag damit verbringen könnte, wenn es sein muss.

Dank

Antwort

7

SMF hat seine Abfrage Zählung durch seine eigene benutzerdefinierte Abfrage Funktion:

function db_query($db_string, $file, $line) 
{ 
    global $db_cache, $db_count, $db_connection, $db_show_debug, $modSettings; 

    // One more query.... 
    $db_count = !isset($db_count) ? 1 : $db_count + 1; 

    ... 

Die einfachste Art und Weise zu erreichen, was Sie versuchen, das gleiche zu tun wäre zu tun; Erstellen Sie einen Wrapper für mysql_query und verwenden Sie diesen anstelle von mysql_query.

0

die Anzahl der Abfragen zu zählen, müssen Sie die Anzahl der Abfragen zählen. Es tut uns leid, dass es überflüssig klingt, aber es ist wirklich so einfach.

Machen Sie eine Zählfunktion (mysql_query_counted?), Dann grep durch Ihre Codebasis für mysql_query( suchen verwenden, und es sollte eine oder zwei Stunden nicht länger als. Eventuell sogar über die Verwendung von sed oder ähnlichem nachdenken, um die Funktionsaufrufe zu ersetzen.

Ein Hinweis auf SMF und ähnliche, die diese eingebaut haben. Sie verwenden DB-Abstraktionsschichten, so dass sie bereits ihre eigene query-Funktion verwenden, und das Hinzufügen von Abfragen zu einem späteren Zeitpunkt wäre so einfach gewesen wie das Hinzufügen einer Zeile, die einen Zähler zu dieser Funktion erhöht. +1 für Abstraktion und Verkapselung nehme ich an.

12
SHOW SESSION STATUS LIKE 'Questions' 
2

Sie können die Anzahl der Abfragen abrufen, die je ausgeführt wurden.

show session status like "Queries"; 

Rufen Sie dies am Anfang und am Ende der Seitenerstellung, und dann können Sie sehen, wie viele Abfragen dort waren. Vergiss nicht, dass dieser Befehl auch als einer gezählt wird.

+1

Sollte dies "Fragen" sein oder spielt es eine Rolle? Ich habe "Abfragen" ausgeführt und kein Ergebnis erhalten, aber "Questions" schien gut zu funktionieren. – jmccartie

+0

Hier ist die Erklärung zu ihnen: http://dev.mysql.com/doc/refman/5.0/en/server-status-variables.html – Zed

2

Hier ist ein Beispiel, das leichter zu folgen ist als das SMF.

class QueryLogger 
{ 
    public $queries = array(); 

    public function query($sql) 
    { 
     $start = microtime(true); 

     $query = mysql_query($sql); 

     $queries[] = microtime(true) - $start; 

     return $query; 
    } 

    public function getCount() 
    { 
     return sizeof($this->queries); 
    } 

    public function getTime() 
    { 
     return array_sum($this->queries); 
    } 
} 

$queryLogger = new QueryLogger; 
$query1 = $queryLogger->query('...'); 
$query2 = $queryLogger->query('...'); 
echo 'Ran '.$queryLogger->getCount().' queries in '.$queryLogger->getTime().' seconds.'; 
+0

In Bezug auf die Zeit, die es dauern würde, um Ihren Code zu aktualisieren, könnten Sie eine Suche machen/ersetzen. Suchen Sie nach 'mysql_query' und ersetzen Sie sie durch '$ queryLogger-> query' – whichdan

+0

. Sie müssen jedoch sicherstellen, dass $ queryLogger instanziiert wird. –

+0

hmm, und für mysqli gibt es nicht viel Veränderung, oder? – bear

3

denke ich, der folgende Befehl eine Zählung pro Sitzung:

SHOW STATUS LIKE 'com_select%' 
1

Nach Quassnoi Kommentar i dies von Skript im Start setzen:

$res = mysql_query("SHOW SESSION STATUS LIKE 'Questions'"); 
$row = mysql_fetch_array($res, MYSQL_ASSOC); 
define("START_QUERIES",$row['Value']); 

und diese:

$res = mysql_query("SHOW SESSION STATUS LIKE 'Questions'"); 
$row = mysql_fetch_array($res, MYSQL_ASSOC); 
define("STOP_QUERIES",$row['Value']); 

Sie insgesamt num von Abfragen mit sehen können:

echo "No of queries: ".(STOP_QUERIES-START_QUERIES-1); 

Ich weiß nicht, warum -1 verwenden, vielleicht zählt es mysql_select_db Aussage (oder smth) auch, aber es funktioniert ziemlich gut auf meinem localhost

Verwandte Themen