2009-08-17 28 views
11

¿cómo puedo contar el número de consultas sql ejecutadas en una carga de página?Número de conteos de consultas MySQL ejecutadas en la página

Tengo un script similar al tiempo empleado para generar la página, pero no para cuántas consultas se han ejecutado.

¿Sabes lo que significa, como en los foros SMF, en el pie de página, que tiene:

Página creada en 0.136 segundos con 7 consultas.

en el pie de página?

Reemplazar todas las mysql_query (s) no es realmente una opción, hay demasiadas mysql_queries para reemplazar, aunque podría pasar un día haciéndolo si fuera necesario.

Gracias

Respuesta

7

SMF hace su conteo consulta por tener su propia función de consulta personalizada:

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 forma más sencilla de lograr lo que estamos tratando de hacer sería hacer lo mismo; crea un contenedor para mysql_query y úsalo en lugar de mysql_query.

0

para contar el número de consultas, es necesario contar el número de consultas. Perdón por sonar redundante, pero realmente es así de simple.

Realice una función de conteo (mysql_query_counted?), Luego use grep para buscar a través de su base de código mysql_query(, y no debería tomar más de una o dos horas. Posiblemente incluso piense en usar sed o similar para reemplazar las llamadas a funciones.

Una nota sobre SMF y similares que tienen esto incorporado. Usan capas de abstracción de base de datos, por lo que ya están usando su propia función query, y agregar el conteo de consultas en una fecha posterior hubiera sido tan simple como agregar una línea incrementando un contador a esa función. +1 para abstracción y encapsulación, supongo.

12
SHOW SESSION STATUS LIKE 'Questions' 
2

Puede obtener el número de consultas que se han realizado al llamar.

show session status like "Queries"; 

Call esto al principio y al final de la creación de la página, y luego se puede ver la cantidad de consultas que ha habido. No olvide que este comando también se cuenta como uno solo.

+1

¿Debería ser esto "Preguntas" o es importante? Ejecuté "consultas" y no obtuve ningún resultado, pero "Preguntas" parecía funcionar bien. – jmccartie

+0

aquí está la explicación sobre ellos: http://dev.mysql.com/doc/refman/5.0/en/server-status-variables.html – Zed

2

Aquí hay un ejemplo que podría ser más fácil de seguir que el 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 cuanto al tiempo que llevaría actualizar su código, podría hacer una búsqueda/reemplazar. Busque 'mysql_query' y reemplace con '$ queryLogger-> query' – whichdan

+0

Aunque tendrá que asegurarse de que $ queryLogger esté instanciado. –

+0

hmm, y para mysqli, no hay mucho cambio ¿verdad? – bear

3

creo que el siguiente comando es un recuento por sesión:

SHOW STATUS LIKE 'com_select%' 
1

Después Quassnoi comentario i poner esto en el inicio de la escritura:

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

y esto:

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

se puede ver num total de consultas con:

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

No sé por qué utilizar -1, tal vez se cuenta mysql_select_db declaración (o algo bajo) también, pero funciona bastante bien en mi localhost

Cuestiones relacionadas