2009-08-17 5 views
11

Comment calculer le nombre de requêtes sql exécutées sur un chargement de page?Nombre de requêtes MySQL exécutées sur la page

J'ai un script similaire au temps nécessaire à la génération de la page, mais pas au nombre de requêtes exécutées.

Vous savez ce que je veux dire, comme sur les forums SMF, dans le pied de page, ils ont:

Page générée en 0,136 secondes avec 7 requêtes.

dans le pied de page?

Remplacer toutes les mysql_query (s) n'est pas vraiment une option, il y a beaucoup trop de mysql_queries à remplacer, bien que je puisse passer une journée à le faire si besoin est.

Merci

Répondre

7

SMF fait son comptage de requête en ayant sa propre fonction de requête personnalisée:

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; 

    ... 

La façon la plus simple pour atteindre ce que vous essayez de faire serait de faire la même chose; faites un wrapper pour mysql_query et utilisez-le à la place de mysql_query.

0

Pour compter le nombre de requêtes, vous devez compter le nombre de requêtes. Désolé de paraître redondant, mais c'est vraiment aussi simple.

Effectuez une fonction de comptage (mysql_query_counted?), Puis utilisez grep pour rechercher dans votre base de code mysql_query(, et cela ne devrait pas prendre plus d'une heure ou deux. Peut-être même penser à utiliser sed ou similaire pour remplacer les appels de fonction.

Une note sur SMF et similaire qui a ce intégré. Ils utilisent des couches d'abstraction DB, donc ils utilisent déjà leur propre fonction query, et ajouter le comptage des requêtes à une date ultérieure aurait été aussi simple que d'ajouter une ligne incrémentant un compteur à cette fonction. +1 pour l'abstraction et l'encapsulation je suppose.

12
SHOW SESSION STATUS LIKE 'Questions' 
2

Vous pouvez obtenir le nombre de requêtes jamais exécutées en appelant. Appelez cela au début et à la fin de la création de la page, puis vous pouvez voir combien de requêtes il y a eu. N'oubliez pas que cette commande elle-même est également comptée comme une seule.

+1

Est-ce que cela devrait être "Questions" ou est-ce important? J'ai couru "requêtes" et n'a pas obtenu un résultat, mais "Questions" semblait bien fonctionner. – jmccartie

+0

voici l'explication sur eux: http://dev.mysql.com/doc/refman/5.0/en/server-status-variables.html – Zed

2

Voici un exemple qui pourrait être plus facile à suivre que celui de 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

En ce qui concerne le temps qu'il faudrait pour mettre à jour votre code, vous pourriez faire une recherche/remplacer. Recherchez 'mysql_query' et remplacez par '$ queryLogger-> query' – whichdan

+0

Bien que vous deviez vous assurer que $ queryLogger est instancié. –

+0

hmm, et pour mysqli, il n'y a pas beaucoup de changement est là? – bear

3

Je pense que la commande suivante est un compte par session:

SHOW STATUS LIKE 'com_select%' 
1

Après Quassnoi commentaire je mets cela en début de script:

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

et ceci:

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

vous pouvez voir num total de requêtes avec:

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

Je ne sais pas pourquoi utiliser -1, peut-être compte mysql_select_db déclaration (ou lissée) aussi, mais cela fonctionne très bien sur mon localhost

Questions connexes